🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi.bazy-danych
3 messages
3 total messages Started by Pancio Wed, 26 Apr 2017 09:09
Pobranie nazw instancji MS SQLa
#82776
Author: Pancio
Date: Wed, 26 Apr 2017 09:09
7 lines
2051 bytes
Witam,
Pisze wlasnie w Delphi XE7 krotki modul do mojej glownej aplikacji, ktory ma za zadanie pobranie listy dostepnych serwerow MS SQL oraz nazwy ich instancji. Caly problem w tym, ze nie moge pobierac tych danych bezposrednio z rejestru Windowsa, bo lacze sie z serwerem po sieci (nie jest to serwer/baza na dysku lokalnym).
O ile znalazlem w internecie rozwiazanie z pobraniem listy nazw serwera (serwerow), to nie moge poradzic sobie z procedura, ktora pobralaby liste nazw instancji przypisanych do danego serwera MS SQL.
Czy ktos z Was przerabial to moze juz u siebie i moglby mi podsunac jakis link (lub na maila kawalek kodu odpowiedzialnego za w/w zadanie)?

--
Pancio
Re: Pobranie nazw instancji MS SQLa
#82777
Author: goo-mlyny
Date: Thu, 27 Apr 2017 09:38
72 lines
3555 bytes
W dniu środa, 26 kwietnia 2017 11:09:36 UTC+2 użytkownik Pancio napisał:
> O ile znalazlem w internecie rozwiazanie z pobraniem listy nazw serwera (serwerow), to nie moge poradzic sobie z procedura, ktora pobralaby liste nazw instancji przypisanych do danego serwera MS SQL.
> Czy ktos z Was przerabial to moze juz u siebie i moglby mi podsunac jakis link (lub na maila kawalek kodu odpowiedzialnego za w/w zadanie)?
Spróbuj może takiej procedury:
procedure ListAvailableSQLServers(Names: TStringList);
var
  RSCon: ADORecordsetConstruction;
  Rowset: IRowset;
  SourcesRowset: ISourcesRowset;
  SourcesRecordset: _Recordset;
  SourcesName, SourcesType: TField;

function PtCreateADOObject(const ClassID: TGUID): IUnknown;
var
  Status: HResult;
  FPUControlWord: Word;
begin
  asm
    FNSTCW FPUControlWord
  end;
  Status := CoCreateInstance(
              CLASS_Recordset,
              nil,
              CLSCTX_INPROC_SERVER or
              CLSCTX_LOCAL_SERVER,
              IUnknown,
              Result);
  asm
    FNCLEX
    FLDCW FPUControlWord
  end;
  OleCheck(Status);
end;

begin
  SourcesRecordset :=
       PtCreateADOObject(CLASS_Recordset)
       as _Recordset;
  RSCon :=
       SourcesRecordset
       as ADORecordsetConstruction;
   SourcesRowset :=
       CreateComObject(ProgIDToClassID('SQLOLEDB Enumerator'))
       as ISourcesRowset;
   OleCheck(SourcesRowset.GetSourcesRowset(
            nil,
            IRowset, 0,
            nil,
            IUnknown(Rowset)));
   RSCon.Rowset := RowSet;
   with TADODataSet.Create(nil) do
   try
     Recordset := SourcesRecordset;
     SourcesName := FieldByName('SOURCES_NAME');
     SourcesType := FieldByName('SOURCES_TYPE');
     Names.BeginUpdate;
     Names.Clear;
     try
        while not EOF do
        begin
          if (SourcesType.AsInteger = DBSOURCETYPE_DATASOURCE) and
             (SourcesName.AsString <> '') then
            Names.Add(SourcesName.AsString);
          Next;
        end;
     finally
        Names.EndUpdate;
     end;
  finally
     Free;
  end;
end;
Re: Pobranie nazw instancji MS SQLa
#82778
Author: Pancio
Date: Thu, 27 Apr 2017 10:21
11 lines
1939 bytes
> Spróbuj może takiej procedury:
> procedure ListAvailableSQLServers(Names: TStringList);
(ciach)

Dziala to jakos koslawo. Pobiera nazwy wszystkich serwerow, ale juz z instancjami gubi sie i niektorych nie wykrywa (nie wiem dlaczego).
Podejrzewam, ze przyklad podales ze strony  http://www.delphigroups.info/2/5c/214177.html

Wczesniej tez juz probowalem tego rozwiazania i nie do konca u mnie to dziala. Ale rzecz jasna dziekuje za odpowiedz.

--
Pancio
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads