TO: L.Ming 还你50分 ^_^ ======= 取得局域网内有效的SQL服务器名称(50分)

  • 主题发起人 主题发起人 北丐洪七
  • 开始时间 开始时间

北丐洪七

Unregistered / Unconfirmed
GUEST, unregistred user!
function Tbrowseform.GetSQLServerList(Strings:TStrings):boolean;
var // 取得局域网内有效的SQL服务器名称
SQLServer: Variant;
ServerList: Variant;
i,serCount:integer;
begin
Strings.Clear;
try
SQLServer := CreateOleObject('SQLDMO.Application');
ServerList := SQLServer.ListAvailableSQLServers;
sercount:= ServerList.Count;
Result:=sercount>0;
for i:=1 to sercount do
if ServerList.item(i)<>'' then Strings.Add(ServerList.item(i));
SQLServer := NULL;
serverList := NULL;
except
result:=false;
end;
end;
你从注册表里读取的多是重复的。用这个。不过这个用SQLDMO,网上还有不用SQLDMO来实现的。
 
如何判断一个机器的MSSQL是否启动//判断一个机器的MSSQL是否启动,通过SQL DMO是可以的,但对于没有装MSSQL的客户端来说就没办法,此处用的是连接MSSQL的1433端口,如果端口号不同,可以通过传递端口.
unit Judge_U;

interface
uses
SysUtils, Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdIcmpClient,
IdTCPClient, IdRawBase, IdRawClient;


function JudgePort(AServerName: PChar; APort: Integer): Boolean;
function JudgePing(AServerName: PChar): Boolean;
implementation

function JudgePing(AServerName: PChar): Boolean;//这个是用来PIN计算机的.
var
ICMP: TIdIcmpClient;
begin
ICMP := TIdIcmpClient.Create(nil);
ICMP.ReceiveTimeout := 1000;
ICMP.Host := AServerName;
try
ICMP.Ping;
Result := True;
except
Result := False;
end;
ICMP.Free;
end;

function JudgePort(AServerName: PChar; APort: Integer): Boolean;
var
IdTCPClient1: TIdTCPClient;
begin
IdTCPClient1 := TIdTCPClient.Create(nil);
IdTCPClient1.Host := AServerName;
IdTCPClient1.Port := APort;
try
IdTCPClient1.Connect;
Result := True;
IdTCPClient1.Disconnect;
except
Result := False;
end;
IdTCPClient1.Free;
end;

end.
//有以下已知的BUG.
//1 如果一台计算机上安装了多个实例.
//2 如果不用TCP/IP协议,而用其它的连接方式,比如典型的命名管道,就无法判断.
 
后退
顶部