注:本机没有安装sql server的客户端或者服务器端,所以使用'SQLDMO.Application'创建对象的方法好像不可行。还有没有其他方法???

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/3459/3459002.xml?temp=.9797937
      

  2.   

    可以的。我在其他机器上试了。(Windows2000)
      

  3.   

    实在不行,可以把SQLDMO.dll拷贝过去
      

  4.   

    如果按照你的那个方法,sqldmo.dll是必须的,好像还得注册,并且4兆的一个文件,不是我想要的,我想知道udl文件的设置原理。
      

  5.   

    procedure TSetupDB_Frm.FormShow(Sender: TObject);
    var
      SQLServer:Variant;
      ServerList:Variant;
      i,nServers:integer;
      sRetValue:String;
    begin
      //列举局域网内所有的SQL服务器
      SQLServer := CreateOleObject('SQLDMO.Application');
      ServerList:= SQLServer.ListAvailableSQLServers;
      nServers:=ServerList.Count;
      Combobox1.Items.Clear;
      for i := 1 to nservers do
        ComboBox1.Items.Add(ServerList.Item(i));
      SQLServer:=NULL;
      serverList:=NULL;
      //默认
      Combobox1.ItemIndex:=0;
    end;
      

  6.   

    客户端能不能可视化地完成数据源的设定(程序中运行UDL文件),我没试过。你试一下。
      

  7.   


    如果在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;
    忘记了是哪里找来的
      

  8.   

    {=================================================================  
    功  能:  返回网络中SQLServer列表  
    参  数:  
    List:  需要填充的List  
    返回值:  成功:  True,并填充List  失败  False  
    =================================================================}  
    Function  GetSQLServerList(var  List:  Tstringlist):  boolean;  
    var  
     i:  integer;  
     SQLServer:  Variant;  
     ServerList:  Variant;  
    begin  
       Result  :=  False;  
       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;  
    转贴,测试通过
      

  9.   

    我已经说过了不能用'SQLDMO.Application'了!!!我就是怕有人重复回这样的帖子,所以才强调了的!!怎么还是有人胡乱就回了。
      

  10.   

    to  helodd(真可爱) 我试了试,运行出错。
      

  11.   

    先创建一个文本文件改为 1.udl (随便取个名称)。双击打开设置一下,分发。
    用1.udl连接。如果连接不上调用
    ShellExecute(0, nil, 'C:\Documents and Settings\Administrator\My Documents\1.udl', nil, nil, 1);
    设置。点确定自动将设置保存在1.udl中。
      

  12.   

    回复人: readersm68(地主) ( ) 信誉:100  2004-10-19 17:44:00  得分: 0  
     
     
       先创建一个文本文件改为 1.udl (随便取个名称)。双击打开设置一下,分发。
    用1.udl连接。如果连接不上调用
    ShellExecute(0, nil, 'C:\Documents and Settings\Administrator\My Documents\1.udl', nil, nil, 1);
    设置。点确定自动将设置保存在1.udl中。
      
     
    ---------------------------------------------
    这个已经考虑过,并被pass掉了。等待中......
      

  13.   

    UDL调用的是OLEDB32.DLL
    下面的网站上有调用接口的例子。
    http://www.588188.com/netbook/tech/VC/html/vc.ohchina.125.htm
      

  14.   

    回复人: readersm68(地主) ( ) 信誉:100  2004-10-19 18:54:00  得分: 0  
     
     
       UDL调用的是OLEDB32.DLL
    下面的网站上有调用接口的例子。
    http://www.588188.com/netbook/tech/VC/html/vc.ohchina.125.htm
      
     
    -------------------------------------------谢谢你一直的关注,你给的这个连接的文章,也只是讲如何在程序中跳出这个对话框,我想delphi的ADO控件就是这样做的。  但是还是没有办法了解它内部到底用了怎样的api函数。
      

  15.   

    那你就工具看看OLEDB32.DLL里面用了那些函数。
      

  16.   

    //那你就工具看看OLEDB32.DLL里面用了那些函数。这种方法有着不可想象的困难。
      

  17.   

    看来想使用OLEDB32.DLL里的函数是有困难的,只好用odbc32.dll里的函数了以下网址列举了三种获得SQL Server列表的方法,我采用的最后一种odbc的方法,速度还可以。http://www.topdelphi.net/Article_Show.asp?ArticleID=9&ArticlePage=1