怎样判断指定的电脑是否有安装SQL?

arraiy 2005-07-11 07:40:37
我现在想得到同一个网络(可能有多个工作组)中的所有装有SQL的服务器列表,但一直没有找到理想的方法!

以前有找到过如下方法,但都不理想:

1、列举出整个网络中的SQL服务器名称,返回值为TRUE表示执行成功,参数List中返回服务器(工作组)的名称,但此方法有限制:要求本机装有SQLDMO,不然就不行
function GetSQLServerList(var List: Tstringlist): boolean;
var
i: integer;
sRetValue: string;
SQLServer: Variant;
ServerList: Variant;
begin
Result := False;
List.Clear;
try
SQLServer := CreateOleObject('SQLDMO.Application'); //此处要uses ComObj;
ServerList := SQLServer.ListAvailableSQLServers;
for i := 1 to Serverlist.Count do
list.Add(Serverlist.item(i));
Result := True;
finally
SQLServer := NULL;
ServerList := NULL;
end;
end;


2、此方法与上面一样可以得到服务器列表,但是局限于本机所在的同一工作组,不能找到别的工作组中的服务器。
const
SV_TYPE_SQLSERVER = $00000004;
type
pDword = ^DWord;
NET_API_STATUS = DWORD;
SERVER_INFO_100 = record
sv100_platform_id : DWord;
sv100_name : pwidechar;
end;

PSERVER_INFO_100 = ^SERVER_INFO_100;
LPSERVER_INFO_100 = ^SERVER_INFO_100;
ASERVER_INFO_100 = array of SERVER_INFO_100;

SERVER_INFO_101 = record
sv101_platform_id : dword;
sv101_name : pwidechar;
sv101_version_major : Dword;
sv101_version_minor : Dword;
sv101_type : dword;
sv101_comment : pchar;
end;

PSERVER_INFO_101 = ^SERVER_INFO_101;
LPSERVER_INFO_101 = ^SERVER_INFO_101;
ASERVER_INFO_101 = array of SERVER_INFO_101;
function NetServerEnum(servername : pchar; level : Dword; var bufptr;
prefmaxlen : integer; entriesread : pDword; totalentries : pDword;
servertype : DWord; domain : pwidechar; resume_handle : integer)
: NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetServerEnum';

function NetApiBufferFree (Buffer : pointer) : NET_API_STATUS;
stdcall; external 'netapi32.dll' name 'NetApiBufferFree';


procedure EnumNetwork(ts: TStrings);
var
pBuf : pByte;
aBuf : ASERVER_INFO_100;
dwEntriesRead : DWORD;
dwTotalEntries : DWORD;
dwServerType : DWORD;
i : DWORD;
name : string;
begin
pBuf := nil;
dwEntriesRead := 0;
dwTotalEntries := 0;
dwServerType := SV_TYPE_SQLSERVER; // all servers

NetServerEnum(nil, 100, pBuf, -1,
@dwEntriesRead, @dwTotalEntries, dwServerType, nil, 0);

aBuf := ASERVER_INFO_100(pBuf);

for i := 0 to dwEntriesRead - 1 do
begin
name := aBuf[i].sv100_name;
ts.add(name);
// name is the name of the SQL Server in the network
end;
if Assigned(pBuf) then NetApiBufferFree(pBuf);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
EnumNetwork(ListBox1.items);
end;

以上两种方法都不理想,有没有更好的?
现求更理想的方法:能找到同一网络中不同工作组中的所有装有SQL的服务器列表。多谢各位帮忙!!在线等!!
...全文
231 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
XLYT 2005-07-12
  • 打赏
  • 举报
回复
请参考:http://dev.csdn.net/article/25/25532.shtm
另外:装有SQL SERVER 2000个人版的服务器是不能被列出来的。
arraiy 2005-07-12
  • 打赏
  • 举报
回复
上面的第一种方法是可以找到同一网络中不同工作组中的所有装有SQL的服务器列表的,但此方法有限制:要求本机装有SQLDMO,不然就不行呀。要不然就只有要发布程序的时候把SQLDMO也打包进去,晕,那好麻烦,包会好大啊!!
lily_1979 2005-07-12
  • 打赏
  • 举报
回复
想找到同一网络中不同工作组中的所有装有SQL的服务器列表,好像不行吧
arraiy 2005-07-12
  • 打赏
  • 举报
回复
帮我顶没用呀,我要答案呀老大们!!!下跪了!!!
fense2002 2005-07-12
  • 打赏
  • 举报
回复
同群UP
paranoia190 2005-07-12
  • 打赏
  • 举报
回复
lovend 2005-07-12
  • 打赏
  • 举报
回复
幫你頂
arraiy 2005-07-12
  • 打赏
  • 举报
回复
怎么没人理我呢?大家帮帮忙呀!!问题解决马上送分!

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧