我想在程序登录时添加一个功能,就是可以搜索本地的sql2000数据库并显示在列表中,应该如何实现呢,谢谢!

解决方案 »

  1.   

    使用UDP, 向广播地址1434端口广播以下数据(9个字节): 08 ED 05 9A 00 09 2D 76 02,然后等待SQL Server的回应,回应包中有SQL Server的信息。
      

  2.   

    看起来有些复杂,是否能说的详细一些,如何使用UDP呢,我是新手,谢谢啊
      

  3.   

    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
      

  4.   

    {=================================================================
     功 能 : 返回网络中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;
      

  5.   

    可以用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端口、管道名等,楼主自己分析吧。
      

  6.   

    使用SQLDMO的话,需要安装并注册SQL Distributed Management Objects(SQL分布式管理对象)的COM组件。
    在实际项目布署时,满足这一条件的工作站并不是很多。
      

  7.   

    回7楼:
      仅需在 uses 中引用 ComObj 即可。
      

  8.   


    回8楼: 
      SQLDMO(SQL Distributed Management Objects)不是随Windows发布的。
      

  9.   

    回楼上:
      没错。但,既然发布有关SQLServer的应用,我想至少需要有ODBC,而MS的ODBC就包含了SQLDMO。不知是否正确,因为我也是猜的。
      

  10.   

    回楼上:
        我的开发环境:2CPU,PIII900,1G Memory,OS: Windows Server 2k3+SP2,IDE: Delphi 10 Lite.
    到现在,还没有发现该功能无法实现.
    不知老兄在什么情况下遇到的这个问题?
      

  11.   

    请教高手这个函数不错但是我在调用的时候为什么会提示:Access Violation at address 77DF5A6 IN MODULE 'USER32.DLL'我在C盘下找到两个这样的DLL,一个大写一个小写的
      

  12.   

    用UDP向1434端口广播08 ED 05 9A 00 09 2D 76 02的方法,根本没有计算机回应。不使用广播而直接向本机1434端口发送,Receive不成功,WSAGetLastError返回WSAECONNRESET。是什么原因?
      

  13.   

    回19楼:
    估计你的电脑中毒了.因为,Windows操作系统只有一个User32.dll,除非是在补丁目录下的一个备份.
    看一下User32.dll的属性.