![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определить список серверов [MSSQL]
MsGuns © (2006-06-26 11:12:00)Как программно определить список активных серверов ?
Причем они могут быть разных версий
Спасибо
MsGuns (2006-06-29 14:29:00) [1]>Johnmen © (26.06.06 11:57) [1]
Списибо за наводку (SQL-DMO),- будем рыть ;)
>Курдль © (28.06.06 09:21) [11]
Огромное спасибо ! Проблема решена
Fay (2006-06-28 09:35:00) [2]2 Курдль © (28.06.06 9:21) [11]
А это не очень жирно?
WSAStartup(MakeWord(2,2), WSAData);
//Получение дескриптора сокета UDP
hSocket := Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (hSocket = INVALID_SOCKET) then exit;
Курдль (2006-06-28 09:21:00) [3]
> не забуду - завтра поищу.
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.
Fay (2006-06-26 18:21:00) [4]> все доступные хосты
ВСЕ ?!!
Курдль (2006-06-26 14:12:00) [5]У меня есть дома где-то код, опрашивающий широковещательным запросом все доступные хосты по порту MS SQL. Если не забуду - завтра поищу.
AxelBlack (2006-06-26 13:50:00) [6]
> MsGuns © (26.06.06 13:21) [7]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sqldmo/dmoref_ob_3tlx.asp
for SQL2005 - see SQL-SMO
SQL Server Management Objects (SMO) is a new managed code object model that replaces SQL Distributed Management Objects (SQL-DMO)
http://msdn2.microsoft.com/en-us/library/ms203817.aspx
MsGuns (2006-06-26 13:21:00) [7]И еще: дайте, пожалуйста, ссылку где почитать об SQLDMO, инет страшно глючный, прокся отказывается от поисковиков ;(((
MsGuns (2006-06-26 13:18:00) [8]Не совсем понял. Как будет выглядеть строка
v.ListAvailableSQLServers...
?
AxelBlack (2006-06-26 13:13:00) [9]
> MsGuns © (26.06.06 13:07) [4]
> v.ListAvailableSQLServers.Count возвращает 1
> Item нету.
Item = '.' ?
+
> MsGuns © (26.06.06 11:12)
> Как программно определить список активных серверов ?
NetServerEnum
MsGuns (2006-06-26 13:07:00) [10]v.ListAvailableSQLServers.Count возвращает 1
Item нету.
AxelBlack (2006-06-26 13:04:00) [11]SQLDMO нет на данной машине?
MsGuns (2006-06-26 12:51:00) [12]EOleSysError 'Член группы не найден'
Johnmen (2006-06-26 11:57:00) [13]Вот из фака. М.б. подойдёт...
var
v: variant;
i: integer;
...
v:=CreateOleObject('SQLDMO.Application');
Memo.Lines.Clear ;
if v.ListAvailableSQLServers.Count>0 then begin
for i:=1 to v.ListAvailableSQLServers.Count do
Memo.Lines.Add(v.ListAvailableSQLServers.item(i));
end;