做到像查询分析器的服务连接列表那样。怎么检测局域网内的sqlserver服务的主机名?

解决方案 »

  1.   

    这个问题已经找到帖子了,还有一个问题:ADO的ConnectionString里面的每一段字符串的值如何分别读取?例如:Workstation ID=HR;  不是要截字符串吧
      

  2.   


    procedure TForm1.FormCreate(Sender: TObject);
    var
    SQLServer  : Variant;
    ServerList : Variant;
    i,nServers : integer;
    begin
      SQLServer  := CreateOleObject('SQLDMO.Application');
      ServerList := SQLServer.ListAvailableSQLServers;
      if serverlist.count < 1 then
         begin //如果服务器不存在,则退出系统
           showmessage('服务器不存在,请检测服务器是否已经开机或者服务是否打开了');
           application.Terminate;
         end
      else
         begin
            for i:= 1 to serverlist.count do
               listbox1.Items.Add(serverlist.item(i)) ;
            showmessage(serverlist.item(1)+'服务器已经打开,可以正常使用本系统');
         end;  SQLServer:=NULL;
      serverList:=NULL;
    end;
    end.
      

  3.   

    我个我已经找到了,谢谢。我还想知道:ADO的ConnectionString里面的每一段字符串的值如何分别读取?例如:Workstation ID=HR;  我要获得这个参数的值不是要截字符串吧
      

  4.   

    culqhlake 的这个方法不能解答这个问题,因为如果本机没有安装sql服务器,就会出错
      

  5.   

    culqhlake 的方法要用ComObj调用已以安装的sqlserver的注册组件,不能实现在不安装sqlserver的机器上使用。有什么办法可以解决呢?
    局域网超级工具 可以做到,而且速度非常快,不知道是怎么做的。
    有高人指点吗?
      

  6.   

    http://expert.csdn.net/Expert/topic/2415/2415164.xml?temp=.3905756有几種方法!
    樓上有一種, 然後, 下面一種, 還有一種, 那個貼子我還找不到!
    如果在nt, 2k, xp下,可用如下解法:
    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;
      

  7.   

    我再跟一个类似的问题:前提:
     现在我知道了局域网内安装有SQL的机器(SQL数据库机器名)。
    要求:
     1.通过选择不同的机器名,取得在该SQL机器上的所有数据库名称。
     2.实现工具DELPHI 6.