Networkdeki SQL Server listesini almak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Networkdeki SQL Server listesini almak

Mesaj gönderen conari »

Netten şöyle bir fonk. buldum ama işimi görmedi.
Hazır compenent veya fonk. varmıdır.

Kod: Tümünü seç

function TdmSmartGolf.GetSQLList(DomainName: string): TStringList;
type
  TIntFunc = function(): PWChar; stdcall;
  Tsql = function(Names: TStrings; const DomainName: string; const 
ServerType:
    DWORD): DWORD; stdcall;
var
  mdList            : THandle;
  PFunc             : TFarProc;         // function handle
  sql               : Tsql;
const
  SV_TYPE_SQLSERVER = $00000004;
begin
  // Get the SQL server name list
  Result := TStringList.Create;
  mdList := LoadLibrary('list.dll');
  if mdList > HINSTANCE_ERROR then
    begin
      try
        PFunc := GetProcAddress(mdList, pchar('SQLSvrEnum'));
        if PFunc <> nil then
          begin
            sql := tsql(PFunc);
            sql(Result, DomainName, SV_TYPE_SQLSERVER);
          end;
      finally
        if Result = nil then
          begin
            dlgMsg := TsuiMessageDialog.Create(Application);
            dlgMsg.Caption := 'APPTitle';
            dlgMsg.Text := 'No SQL Servers found!';
            dlgMsg.IconType := suiStop;
            dlgMsg.ShowModal;
            FreeAndNil(dlgMsg);
          end;
      end;
    end;
   //FreeLibrary(mdList);    //If I execute this line,
                            //there is an Access Violation Error
end;
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Bu arada bunu MS SQL araçları bile tam manasıyla yapamıyor ve bulunduğum ağ için yapan program da görmedim.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Aslında bu kod İpleri ve isimleri(Sql server ismini değil) veriyor.
bir tmemo ve tButton ekleyerek. Referans http://www.clubdelphi.com/

Kod: Tümünü seç

unit Unit1_SQLServers;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs,
   Winsock, StdCtrls;
 
 // Put this constant in the start of your unit!
 Const
   Socket_WM_Hook = WM_User + 100;
 
 type
   TForm1 = class(TForm)
     Memo1: TMemo;
     Button1: TButton;
     procedure Button1Click(Sender: TObject);
   private
     { Private declarations }
     Procedure TCPSocket_WM_Hook(Var Msg: TMessage); Message Socket_WM_Hook;
     Procedure GetIPAddresses(List: TStrings);
     Procedure ListSQLServers(SQLList: TStrings);
   public
     { Public declarations }
   end;
 
 var
   Form1: TForm1;
 
 
 
 
 // This variable should be put inside your TForm class, but is not necessary!
 ConnectionStatus : Integer;
 
 
   Function WSAIoctl(s: TSocket; cmd: DWORD; lpInBuffer: PCHAR; dwInBufferLen:
     DWORD;
     lpOutBuffer: PCHAR; dwOutBufferLen: DWORD;
     lpdwOutBytesReturned: LPDWORD;
     lpOverLapped: POINTER;
     lpOverLappedRoutine: POINTER): Integer; stdcall; external 'WS2_32.DLL';
 
 implementation
 
 {$R *.dfm}
 
 Procedure TForm1.TCPSocket_WM_Hook(Var Msg: TMessage);
 Var
   InputSocket : TSocket;
   Selectevent : Word;
 
 Begin
    InputSocket := Msg.wParam;
    IF InputSocket <> Invalid_Socket Then
    Begin
       Selectevent := WSAGetSelectEvent(Msg.lParam);
 
       Case Selectevent of
         FD_READ    : ;
         FD_CONNECT : ConnectionStatus := 1;
         FD_CLOSE   : ConnectionStatus := 2;
       End;
    End;
 End;
 
 Procedure TForm1.GetIPAddresses(List: TStrings);
 Type
   sockaddr_gen = packed Record
                            AddressIn : sockaddr_in;
                            filler    : packed Array[0..7] of char;
                         End;
 
   INTERFACE_INFO = packed Record
                              iiFlags            : u_long; // Interface flags
                              iiAddress          : sockaddr_gen; // Interface address
                              iiBroadcastAddress : sockaddr_gen; // Broadcast address
                              iiNetmask          : sockaddr_gen; // Network mask
                           End;
 
 
 Const
   SIO_GET_INTERFACE_LIST = $4004747F;
 
 Var
   ErrorCode     : Integer;
   WSAData       : TWSAData;
   Sock          : TSocket;
   PtrA          : Pointer;
   Buffer        : Array[0..20] of INTERFACE_INFO;
   BytesReturned : U_Long;
   I             : Integer;
   NumInterfaces : Integer;
   pAddrInet     : SOCKADDR_IN;
   pAddrString   : pChar;
   S             : String;
 
 Begin
    List.Clear;
 
    ErrorCode := WSAStartup($0101, WSAData);
    IF (ErrorCode = 0) Then
    Begin
       Sock := Socket(AF_INET, SOCK_STREAM, 0);         // Open a socket
       IF (Sock <> INVALID_SOCKET) Then
       Begin
          PtrA := @bytesReturned;
          IF (WSAIoCtl(Sock, SIO_GET_INTERFACE_LIST, NIL, 0, @Buffer, 1024, PtrA, NIL, NIL) <> SOCKET_ERROR) Then
          Begin
             NumInterfaces := BytesReturned div SizeOf(INTERFACE_INFO);
             For I := 0 to NumInterfaces - 1 do        // For every interface
             Begin
                S := '';
 
                pAddrInet := Buffer[i].iiAddress.addressIn;           // IP ADDRESS
                pAddrString := inet_ntoa(pAddrInet.sin_addr);
                IF (StrPas(pAddrString) <> '127.0.0.1') Then
                Begin
                   S := S + pAddrString + ',';
 
                   pAddrInet := Buffer[i].iiNetMask.addressIn;           // SUBNET MASK
                   pAddrString := inet_ntoa(pAddrInet.sin_addr);
                   S := S + pAddrString;
 
                   List.Add(S);
                End;
             End;
          End;
          CloseSocket(Sock);
       End;
 
       WSACleanup;
    End;
 End;
 
 Procedure TForm1.ListSQLServers(SQLList: TStrings);
 
 
 
     Function GetNumber(S: String; Nr: Byte) : Word;
     Var
       T : Integer;
 
     Begin
        While (Nr > 1) do
        Begin
           T := Pos('.', S);
           IF (T = 0) Then T := Length(S)+1;
           Delete(S, 1, T);
 
           Dec(Nr);
        End;
 
        T := Pos('.', S);
        IF (T = 0) Then T := Length(S)+1;
        Result := StrtointDef(Copy(S, 1, T-1), 0);
        Delete(S, 1, T);
     End;
 
     Function IPOk(CurrentIP, SrvIP, SrvMask: String) : Boolean;
     Var
       T         : Integer;
       I, M, Num : Integer;
 
     Begin
        Result := True;
        For T := 1 to 4 do
        Begin
           I   := GetNumber(SrvIP, T);
           M   := GetNumber(SrvMask, T);
           Num := GetNumber(CurrentIP, T);
 
           IF (Num < (I and M)) or (Num > ((I and M)+(255-M))) Then Result := False;
        End;
     End;
 
     Function IsSQLServer(IP: String; var SQLName: String) : Boolean;
     Var
       Sock              : TSocket;
       SockAddr          : SockAddr_In;
       IP_Address_Array  : Array[0..32] of Char; // Don't need more than 15 though... 
       Error             : Integer;
       Timer             : TDateTime;
       HostEnt           : PHostEnt;
 
     Begin
        Result := False;
 
 
        Sock := Socket(PF_INET, SOCK_STREAM, 0);         // Open a socket
        IF (Sock <> INVALID_SOCKET) Then
        Begin
           Strpcopy(IP_Address_Array, IP);
 
           // ms-sql-s
           // 1433
           SockAddr.Sin_Addr.S_addr := Inet_Addr(IP_Address_Array);
           SockAddr.Sin_Port    := HtoNS(1433); // Service: 'ms-sql-s' ???
           SockAddr.Sin_Zero[0] := Char(0);
           SockAddr.Sin_Family  := AF_INET;
        End;
 
 
        // Set the socket into asynchronous mode, so it will trigger the wMsg
        //   event in the hWnd window when the connection has been made
        WSAAsyncSelect(Sock, self.Handle, Socket_WM_Hook, FD_READ or FD_CONNECT or FD_CLOSE);
 
 
        Error := Connect(Sock, TSockaddr(SockAddr), Sizeof(SockAddr));
        IF (Error = SOCKET_ERROR) Then
        Begin
           IF (WSAGetLastError = WSAEWOULDBLOCK) Then Error := 0;
        End
         Else Error := 0;
 
        IF (Error = 0) Then
        Begin
           ConnectionStatus := 0;
 
 
           // Set your own timeout value. I've had success with as low as 0.01 (10ms) ...
           // 0.1 = 100ms   0.2 = 200ms ...
           Timer := Now;
           While (ConnectionStatus = 0) and (Timer+(0.01/86400) > Now) do Application.ProcessMessages;
           Result := (ConnectionStatus = 1);
 
 
           IF (Result) Then
           Begin
              HostEnt := GetHostByAddr(@SockAddr.sin_addr.S_addr, 4, PF_INET);
              IF (Assigned(HostEnt)) Then
              Begin
                 SQLName := HostEnt.h_name;
              End
               Else SQLName := IP;
           End;
        End;
        CloseSocket(Sock);
     End;
 
 
 
 Var
   I, T    : Integer;
   BaseIP  : String;
   CurIP   : String;
   S       : String;
   IP      : String;
   Mask    : String;
   Error   : Integer;
   WSAData : TWSAData;
   SQLName : String;
   IPAddresses : TStringList;
 
 Begin
    IPAddresses := TStringList.Create;
 //   IPAddresses.Add('139.117.69.80,255.255.255.0');
    GetIPAddresses(IPAddresses);
 
 
    Error := WSAStartup($0101, WSAData);
    IF (Error = 0) Then
    Begin
       For I := 0 to IPAddresses.Count-1 do
       Begin
          S := IPAddresses.Strings[i];
          IP := Copy(S, 1, Pos(',', S)-1);
          Mask := Copy(S, Pos(',', S)+1, Length(S));
 
          // Create base IP address (first 3 numbers)...
          BaseIP := '';
          For T := 1 to 3 do BaseIP := BaseIP + IntToStr(GetNumber(IP, T))+'.';
 
          For T := 1 to 254 do // 0 & 255 is not valid IP addresses...
          Begin
             CurIP := BaseIP+IntToStr(T);
 
             IF (IPOk(CurIP, IP, Mask)) Then
             Begin
                IF (IsSQLServer(CurIP, SQLName)) Then
                Begin
                   SQLList.Add(SQLName);
                End;
             End;
             Application.ProcessMessages;
          End;
       End;
       WSACleanup;
    End;
 
    IPAddresses.Free;
 End;
 
 
 
 procedure TForm1.Button1Click(Sender: TObject);
 begin
   GetIPAddresses(Memo1.Lines);
   ListSQLServers(Memo1.Lines);
 MessageDlg('Done', mtInformation, [mbOK], 0);
 end;
 
 end.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Ayrıca hocam;
Adoconn. nesnesinde
OLE DB provider for SQL Server seçerek
Bağlantı kısmında Sunucu adını seçin girin kısmındaki combobox a nasıl geliyor bu isimler?
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Söylediğim gibi. Bende o liste düzgün gelmiyor. Sadece kendi bilgisayarımdaki isimler geliyor. Hatta service manager için de durum aynı :( . Hal böyle oluncada bu değerleri elle yazmak durumunda kalıyorum (ihtiyaçtan :wink: ) .
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
odemir01
Üye
Mesajlar: 31
Kayıt: 01 Eki 2007 10:37
Konum: Adana

Mesaj gönderen odemir01 »

aşağıdaki kod tam olarak olmadasa sql serverlerin bir listesini bir comboboxa almanı sağlıyor



uses ActiveX, ComObj, AdoInt, OleDB;

procedure ListAvailableSQLServers(Names : TStrings);
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'); { do not localize }
SourcesType := FieldByName('SOURCES_TYPE'); { do not localize }
Names.BeginUpdate;
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;



Kullanımı ise

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Screen.Cursor := crSQLWait;
cboServers.Items.Clear;
try
ListAvailableSQLServers(cboServers.Items);
finally
Screen.Cursor := crDefault;
end;

if cboServers.Items.Count>0 Then
cboServers.Itemindex:=0;

end;
Varsa Yoksa Delphi
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

İşte tam istediğim şey bu,
Kodları kullandım çalışıyor.
Teşekkürler
Bir de Cod tagları(site kuralları) arasına alsaydın çok güzel olacaktı.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

conari yazdı:Bir de Cod tagları(site kuralları) arasına alsaydın çok güzel olacaktı.
arkadaşın daha 5. mesajı. alışır ilerde
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Çok başarılı bir kod fakat makinamdaki farklı instancename'lere sahip sql'leri listeye eklemedi. Gerçi kendi makinemdeki insatancename'leri elde etmenin bir yolu var fakat ağdaki diğer makinalarda bulunan sql'lerin instancename'leriyle birlikte listeye gelmesi de sağlanırsa çok süper olacak.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
KOROGLUCW
Üye
Mesajlar: 36
Kayıt: 02 May 2013 09:10
İletişim:

Re: Networkdeki SQL Server listesini almak

Mesaj gönderen KOROGLUCW »

hocam şöyle bir şey yazayım şuan serverları listeleye biliyorum ama kendi localimdeki database'leri görmek istiyorum nasıl yapacam ?

VeSSeLaM.
En iyi Sistem fişi çekilmiş Sistem'dir.
Cyber-Warrior.org/K@R@GLU
Kullanıcı avatarı
KOROGLUCW
Üye
Mesajlar: 36
Kayıt: 02 May 2013 09:10
İletişim:

Re: Networkdeki SQL Server listesini almak

Mesaj gönderen KOROGLUCW »

sql server name listesini alabiliyorum fakat database listesini nasıl alabilirim ki?

VeSSeLaM.
En iyi Sistem fişi çekilmiş Sistem'dir.
Cyber-Warrior.org/K@R@GLU
Cevapla