CREATE PROCEDURE EnumerateSQLServers AS /* 存储过程名称: EnumerateSQLServers 作者 : Srdjan Josipovic 日期 : 2002-06-19 目的 :使用SQLDMO和TSQL列出所有可用的实例 翻译整理 :王成辉*/DECLARE @retval int DECLARE @result varchar(500) DECLARE @object int DECLARE @objectList int DECLARE @src varchar(254) DECLARE @desc varchar(255) DECLARE @resultsCount int DECLARE @counter int DECLARE @method varchar(255)--创建SQLDMO对象 EXEC @retval = sp_OACreate 'SQLDMO.Application', @object OUT--检查对象是否创建成功 IF @retval <> 0 BEGIN EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc RETURN END --调用方法ListAvailableServers() , 为SQLDMO.NameList得到Object_ID EXEC @retval = sp_OAMethod @object , 'ListAvailableSQlServers()' , @objectList OUT -- 是否有错误? IF @retval <> 0 BEGIN EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc RETURN END --计算局域网里的服务器数量 EXEC @retval = sp_OAGetProperty @objectList , 'Count' , @resultsCount OUT --再一次进行错误处理 IF @retval <> 0 BEGIN EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc RETURN END--如果有服务器的话,进入处理..... IF @resultsCount > 0 BEGIN SET @counter = 1 DECLARE @ServersTbl table (ServerID int IDENTITY ,ServerName varchar(255)) WHILE @counter <= @resultsCount BEGIN --列出SQL实例:一个名字接一个名字的列出 SET @method = 'Item(' + convert(varchar(3),@counter) + ')' EXEC @retval = sp_OAGetProperty @objectList ,@method , @result OUT
--将数据存到临时表 INSERT INTO @ServersTbl (ServerName) SELECT @result
--移到下一条记录 SET @counter = @counter + 1 END END ELSE BEGIN SET @result = 'No Servers around you' INSERT INTO @ServersTbl (ServerName) SELECT @result END --释放对象 EXEC @retval = sp_OADestroy @object IF @retval <> 0 BEGIN EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc RETURN END--好了,可以列出所有可用的实例了 .... SELECT * FROM @ServersTbl GO
可以用Indy的UDPClient组件来实现 procedure TForm1.Button1Click(Sender: TObject); var s : String; begin IdUDPClient1.Broadcast(chr(2), 1434); repeat s := IdUDPClient1.ReceiveString(5000); if s <> '' then Memo1.Lines.Add(Copy(S, 4, Length(S) - 3)); until s = ''; end; 返回的内容是由分号分隔的一系列信息的字符串, 包括服务器名、版本号、TCP端口、管道名等,楼主自己分析吧。
AS
/*
存储过程名称: EnumerateSQLServers
作者 : Srdjan Josipovic
日期 : 2002-06-19
目的 :使用SQLDMO和TSQL列出所有可用的实例
翻译整理 :王成辉*/DECLARE @retval int
DECLARE @result varchar(500)
DECLARE @object int
DECLARE @objectList int
DECLARE @src varchar(254)
DECLARE @desc varchar(255)
DECLARE @resultsCount int
DECLARE @counter int
DECLARE @method varchar(255)--创建SQLDMO对象
EXEC @retval = sp_OACreate 'SQLDMO.Application', @object OUT--检查对象是否创建成功
IF @retval <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc
RETURN
END
--调用方法ListAvailableServers() , 为SQLDMO.NameList得到Object_ID
EXEC @retval = sp_OAMethod @object , 'ListAvailableSQlServers()' , @objectList OUT
-- 是否有错误?
IF @retval <> 0
BEGIN
EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc
RETURN
END
--计算局域网里的服务器数量
EXEC @retval = sp_OAGetProperty @objectList , 'Count' , @resultsCount OUT
--再一次进行错误处理
IF @retval <> 0
BEGIN
EXEC sp_OAGetErrorInfo @objectList, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc
RETURN
END--如果有服务器的话,进入处理.....
IF @resultsCount > 0
BEGIN
SET @counter = 1
DECLARE @ServersTbl table (ServerID int IDENTITY ,ServerName varchar(255))
WHILE @counter <= @resultsCount
BEGIN
--列出SQL实例:一个名字接一个名字的列出
SET @method = 'Item(' + convert(varchar(3),@counter) + ')'
EXEC @retval = sp_OAGetProperty @objectList ,@method , @result OUT
--将数据存到临时表
INSERT INTO @ServersTbl (ServerName) SELECT @result
--移到下一条记录
SET @counter = @counter + 1
END
END
ELSE
BEGIN
SET @result = 'No Servers around you'
INSERT INTO @ServersTbl (ServerName) SELECT @result
END
--释放对象
EXEC @retval = sp_OADestroy @object
IF @retval <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@retval), Source=@src, Description=@desc
RETURN
END--好了,可以列出所有可用的实例了 ....
SELECT * FROM @ServersTbl
GO
功 能 : 返回网络中SQLServer列表
参 数 : List: 需要填充的TstringList
返回值: 成功: True,并填充List 失败 False
备 注 : 需引用 ComObj
版 本 : 1.0 2002/10/02 22:44:00
=================================================================}
function TForm1.GetSQLServerList(List: TstringList): boolean;
var
i: integer;
SQLServer: Variant;
ServerList: Variant;
begin
List.Clear;
try
SQLServer:= CreateOleObject('SQLDMO.Application');
ServerList:= SQLServer.ListAvailableSQLServers;
for i:= 1 to Serverlist.Count do
list.Add(Serverlist.item(i));
Result:= True;
Finally
SQLServer:= NULL;
ServerList:= NULL;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s : String;
begin
IdUDPClient1.Broadcast(chr(2), 1434);
repeat
s := IdUDPClient1.ReceiveString(5000);
if s <> '' then Memo1.Lines.Add(Copy(S, 4, Length(S) - 3));
until s = '';
end;
返回的内容是由分号分隔的一系列信息的字符串, 包括服务器名、版本号、TCP端口、管道名等,楼主自己分析吧。
在实际项目布署时,满足这一条件的工作站并不是很多。
仅需在 uses 中引用 ComObj 即可。
回8楼:
SQLDMO(SQL Distributed Management Objects)不是随Windows发布的。
没错。但,既然发布有关SQLServer的应用,我想至少需要有ODBC,而MS的ODBC就包含了SQLDMO。不知是否正确,因为我也是猜的。
我的开发环境:2CPU,PIII900,1G Memory,OS: Windows Server 2k3+SP2,IDE: Delphi 10 Lite.
到现在,还没有发现该功能无法实现.
不知老兄在什么情况下遇到的这个问题?
估计你的电脑中毒了.因为,Windows操作系统只有一个User32.dll,除非是在补丁目录下的一个备份.
看一下User32.dll的属性.