Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить список серверов MS SQL в сети? [D7, MSSQL]


Карелин Артем ©   (2005-10-27 10:49:00) 

Есть сеть доменная. Вопрос в теме.


Курдль   (2005-10-27 13:35:00) [1]


unit FMain;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Winsock;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   procedure GetServersList(Storage: TStrings);
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 GetServersList(Memo1.Lines);
end;

procedure TForm1.GetServersList(Storage: TStrings);
var
hSocket: TSocket;
WSAData: TWSAData;
Buf: array[0..65535] of byte;
i, iBeg, tRes, tLenSA, tLenBufRecv, tFlagStep: integer;
tLenBufIOCTL: u_long;
S, S2, S3: AnsiString;
saSQLSend, saSQLRecv: sockaddr_in;
Data: byte;

const
fBroadcast: boolean = True;

begin
Data := $02;
Storage.Clear;
WSAStartup(MakeWord(2,2), WSAData);

//Ïîëó÷åíèå äåñêðèïòîðà ñîêåòà UDP
hSocket := Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (hSocket = INVALID_SOCKET) then exit;

//Óñòàíîâêà îïöèé ñîêåòà
tRes := setsockopt(hSocket, SOL_SOCKET{IPPROTO_TCP}, SO_BROADCAST, @fBroadcast,sizeof(BOOL));
if (tRes = SOCKET_ERROR) then
begin
  closeSocket(hSocket);
  exit;
end;

//Óñòàíîâêà äàííûõ ñëóæåáíîé ñòðóêòóðû  sockaddr_in
saSQLSend.sin_family  := AF_INET;
saSQLSend.sin_port := htons(1434);
saSQLSend.sin_addr.s_addr := htonl(INADDR_BROADCAST);

//Ïîñûëêà øèðîêîâåùàòåëüíîãî ñîîáùåíèÿ
tRes := sendto(hSocket, Data, 1, 0, saSQLSend, sizeof(SOCKADDR_IN));
if (tRes = SOCKET_ERROR) then
begin
  closeSocket(hSocket);
  exit;
end;

Sleep(100);

//
tRes := ioctlSocket(hSocket,FIONREAD,tLenBufIOCTL);
if (tRes = SOCKET_ERROR) then
begin
  closeSocket(hSocket);
  exit;
end;

if (tLenBufIOCTL > 0) then
begin
  tFlagStep := 0;
  tLenSA := sizeof(SOCKADDR_IN);
  saSQLRecv := saSQLSend;
  while tLenBufIOCTL > 0 do
  begin
    tLenBufRecv := recvfrom(hSocket, Buf, 65535, 0, saSQLRecv, tLenSA);
    tLenBufIOCTL := tLenBufIOCTL - tLenBufRecv;

    if(tLenBufRecv=SOCKET_ERROR) then
    begin
      closeSocket(hSocket);
      exit;
    end;

    iBeg := 1;
    S2 := '';
    for i := 3 to tLenBufRecv - 3 do S2 := S2 + Chr(Buf[i]);
    tLenBufRecv := tLenBufRecv - 3;

    for i := 1 to tLenBufRecv - 3 do
    begin
      if(S2[i]=';') then
      begin
        S := Copy(S2,iBeg,i - iBeg);
        if (tFlagStep=1) then S3 := S;
        if (tFlagStep=2) then
        begin
          if(S 'MSSQLSERVER') then S3 := S3 + ('\\' + S);
          Storage.Add(S3);
          S3 := '';
        end;
        tFlagStep := 0;
        if(S='ServerName') then tFlagStep := 1;
        if(S='InstanceName') then tFlagStep := 2;
        iBeg := i + 1;
      end;
    end;

  end;
end;
closeSocket(hSocket);
WSACleanup;
end;

end.


Johnmen   (2005-10-27 13:27:00) [2]

Уже ушла в историю...:)

uses ComObj;

var
 v : variant;
 i : integer;
...
 v:=CreateOleObject('SQLDMO.Application');
 Memo.Clear ;
 if v.ListAvailableSQLServers.Count>0 then
   for i:=1 to v.ListAvailableSQLServers.Count do
     Memo.Lines.Add(v.ListAvailableSQLServers.Item(i));
...


Карелин Артем   (2005-10-27 12:45:00) [3]

Произошла ошибка:

Не найдена ветка № 1127135003, возможно она была удалена или перенесена в другой форум.


Johnmen   (2005-10-27 12:15:00) [4]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1127135003&n=1


Наверх

Титульная страница Поиск, карта сайта Написать письмо