if RetCode <> SQL_ERROR then
begin
TmpStr := PChar(ConnStrOut);
if InfoType = itLanguage then
Delete(TmpStr, 1, AnsiPos('};', TmpStr) + 1);
Delete(TmpStr, 1, AnsiPos(SplitterStr, TmpStr) + 1);
Delete(TmpStr, AnsiPos('}', TmpStr), Length(TmpStr));
while TmpStr <> '' do
begin
TmpPos := AnsiPos(',', TmpStr);
if TmpPos > 0 then
AList.Add(Copy(TmpStr, 1, TmpPos - 1))
else
begin
AList.Add(TmpStr);
TmpStr := '';
end;
Delete(TmpStr, 1, TmpPos)
end;
Result := True;
end;
FreeMem(ConnStrOut, ConnStrOutMax);
finally
if Assigned(HDBC) then
begin
SQLDisconnect(HDBC);
SQLFreeHandle(SQL_HANDLE_DBC, HDBC);
HDBC := nil;
end;
if Assigned(HENV) then
begin
SQLFreeHandle(SQL_HANDLE_ENV, HENV);
HENV := nil;
end;
end;
end;
张伟(Alan) Alan@cnvcl.org
转载请注明出处并保持完整性!
How to list all installed MS SQL Server Name by Delphi?
procedure FindSQLServers(aList: tStrings); // try an (inofficial) connect to sqlserver on port 1434
var
UDP: tidUDPClient;
IP, T, D, Peer, REC, S: string;
Port: Integer;
ServerName, InstanceName, TCPPort, Version: string;
begin
UDP := tidUDPCLient.Create(nil);
try
S := GStack.LocalAddress;
IP := Fronttoken(S, '.') + '.' + Fronttoken(S, '.') + '.' + Fronttoken(S, '.') + '.255';
UDP.Host := IP;
UDP.Port := 1434;
UDP.BroadcastEnabled := True;
UDP.ReceiveTimeout := 6000;
aList.Clear;
UDP.Send(#2);
repeat
ServerName := '';
InstanceName := '';
REC := UDP.ReceiveString(Peer, Port);
S := Copy(REC, 4, MaxInt);
while length(S) > 0 do
begin
if S = ';' then
begin
s := '';
end
else
begin
T := Fronttoken(S, ';');
D := Fronttoken(S, ';');
if T = 'SERVERNAME' then
Servername := D
else
if T = 'INSTANCENAME' then
InstanceName := D
else
if T = 'TCP' then
TCPPort := D
else
if T = 'VERSION' then Version := D;
end;
end;
if ServerName <> '' then
begin
if InstanceName <> 'MSSQLSERVER' then
S := Servername + '\' + InstanceName
else
S := Servername;
// aList.Add(S+' ('+Peer+'.'+TCPPort+') Version '+Version );
aList.Add(S);
end;
until REC = '';
finally
UDP.Free;
end;