大哥们怎么获取局域网中的所有 SQL Server 服务器 用DHLPHI怎么写
好象调用SQLDMO_TLB.pas可以实现但是不知道怎么写。
有空件更好了 呵呵

解决方案 »

  1.   

    SQLDMO   对像来自   SQL   Server   2000   提供的动态连接库   SQLDMO.dll。     这个   dll   本身是一个   COM   对像,首先你必须从类型库中引用Microsoft   SQLDMO   Object   Library   (Version   8.0).   Delphi   会自动为你生成SQLDMO_TLB.PAS文件,文件中包括了所有   COM   对象的接口。   
        
          
          
        
      在这里我们需要注意,由于引入的SQLDMO   “TDatabase”和   “TApplication”和其它几个缺省类名与   Delphi   自带的类名冲突,所以自己可以修改成   _TypeName   的形式。或者其它的名字,我在这里改成   T_Application   、T_Database   等。   
        
      我们下一步要做的是在我们的程序中引入单元文件   SQLDMO_TLB.PAS   。   应用程序单元名称是   SqlServers     
        
      程序运行界面如下:   
        
          
        
        
      服务器列表中是局域网中所有的   SQL   SERVER   服务器,选择服务器后输入用户名和密码,下拉数据库列表,程序会列出此服务器中的所有数据库.   
        
      程序源代码如下:   
        
      unit   SqlServers;   
        
      interface   
        
      uses   
        
          Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,   Dialogs,   
        
          StdCtrls,   Buttons,   ComCtrls   ,   SQLDMO_TLB;//注意别忘了引入此文件   
        
      type   
        
          TdmoObject   =   record   
        
              SQL_DMO         :   _SQLServer;   
        
              lConnected   :   boolean;   
        
          end;   
        
          
        
      type   
        
          TFormServersList   =   class(TForm)   
        
              Label1:   TLabel;   
        
              Label2:   TLabel;   
        
              CB_ServerNames:   TComboBox;   
        
              CB_DataNames:   TComboBox;   
        
              Label3:   TLabel;   
        
              Label4:   TLabel;   
        
              Ed_Login:   TEdit;   
        
              Ed_Pwd:   TEdit;   
        
              BitBtn1:   TBitBtn;   
        
              BitBtn2:   TBitBtn;   
        
              procedure   FormCreate(Sender:   TObject);   
        
              procedure   FormCloseQuery(Sender:   TObject;   var   CanClose:   Boolean);   
        
              procedure   FormClose(Sender:   TObject;   var   Action:   TCloseAction);   
        
              procedure   FormShow(Sender:   TObject);   
        
              procedure   BitBtn2Click(Sender:   TObject);   
        
              procedure   CB_DataNamesDropDown(Sender:   TObject);   
        
          private   
        
              server_Names   :   TStringList;   
        
              //对象集合         
        
              PdmoObject   :   array   of   TdmoObject;   
        
              //获取所有的远程服务器   
        
              Function   GetAllServers(ServerList   :   TStringList)   :   Boolean;   
        
              {   Private   declarations   }   
        
          public   
        
              {   Public   declarations   }   
        
          end;   
        
          
        
      var   
        
          FormServersList:   TFormServersList;   
        
      implementation   
        
          
        
      {$R   *.DFM}   
        
          
        
      {   TForm1   }   
        
          
        
      Function   TFormServersList.GetAllServers(ServerList   :   TStringList)   :   Boolean;     
      var   
          sApp:_Application;   
          sName:NameList;   
          iPos:integer;   
      begin   
          Result:=True;   
          try   
              sApp:=CoApplication_.Create;   //创建的对象不用释放,delphi   自己会释放   
              sName:=sApp.ListAvailableSQLServers;   
          except   
              Result:=False;   
              Exit;   
          end;   
          if  sName.Count>0   then   //   之所以 iPos   从1开始,是因为0   位置为空值即   '   '   
          for   iPos:=1   to   sName.Count-1   do   
          begin   
              CB_ServerNames.Items.Add(sName.Item(iPos));   
              ServerList.Add(sName.Item(iPos));    
          end;     
      end;   
             
        
      procedure   TFormServersList.FormCreate(Sender:   TObject);     
      var    
          lcv:integer;   
      begin   
          server_Names:=TStringList.Create;   
          if   not   GetAllServers(server_Names)   then   
          begin   
              Application.MessageBox('无法获取服务器列表,可能缺少客户端DLL库函数','错误提示',MB_OK);   
              exit;   
          end;   
          for   lcv:=0   to   server_Names.Count-1   do   
          begin   
              SetLength(PdmoObject,lcv   +   1);   
              with   PdmoObject[lcv]   do   
              begin   
                  SQL_DMO   :=   CoSQLServer.Create;   
                  SQL_DMO.Name   :=   Trim(server_Names[lcv]); //登陆安全属性,NT   身份验证   
                  SQL_DMO.LoginSecure:=false;  //   设置一个连接超时     
                  SQL_DMO.LoginTimeout:=3;   //自动重新登陆,如果第一次失败后     
                  SQL_DMO.AutoReconnect:=true;   
                  SQL_DMO.ApplicationName:=server_Names[lcv];   
                  lConnected:=false;   
              end;    
          end;   
      end;   
        
          
    procedure   TFormServersList.FormCloseQuery(Sender:   TObject;   var   CanClose:   Boolean);      
      begin      
          server_Names.Free;   
      end;   
               
    procedure   TFormServersList.FormClose(Sender:   TObject;   var   Action:   TCloseAction);   
        begin   
         Action:=CaFree;     
      end;   
          
    procedure   TFormServersList.FormShow(Sender:   TObject);   
        
      begin    
          if CB_ServerNames.Items.Count>0   then   //列举所有服务器名字   
             CB_ServerNames.Text:=CB_ServerNames.Items.Strings[0];      
      end;   
           
    procedure   TFormServersList.BitBtn2Click(Sender:   TObject);      
      begin      
          Close;     
      end;   
             
    procedure   TFormServersList.CB_DataNamesDropDown(Sender:   TObject);    
      var    
          icount,Server_B:integer;    
      begin   
          CB_DataNames.Clear;   
          Screen.Cursor:=CrHourGlass;   
          Server_B:=CB_ServerNames.Items.IndexOf(CB_ServerNames.Text);   
          with   PdmoObject[Server_B].SQL_DMO   do   
          begin   
              if   not   PdmoObject[Server_B].lConnected   then   
              try   
                  Connect(Name,Trim(Ed_Login.Text),Trim(Ed_Pwd.Text));   
              except   
                  Screen.Cursor:=CrDefault;   
                  Application.MessageBox('请检查用户名或密码是否正确','连接失败',MB_OK);   
                  Exit;   
              end;   
              if   not   VerifyConnection(SQLDMOConn_ReconnectIfDead)   then   
              begin   
                  ShowMessage('在试图连接到SQL   SERVER   2000  时出现错误'+#10#13 +'确信是否加在了动态连接库SQLDMO.DLL');    
                  exit;   
              end   else   
                  PdmoObject[Server_B].lConnected:=True;   
              Databases.Refresh(true);   
              for   icount:=1   to   Databases.Count   do   
               CB_DataNames.Items.Add(Databases.Item(icount,null).name);   
          end;   
        Screen.Cursor:=CrDefault;       
     end   
    end   
      

  2.   

    很简单,引用Comobj单元,
    然后使用函数CreateOleObject创建SqlDmo实例如下
    var
    demo,save: variant;
    i:integer;
    begin
      self.ComboBox1.Items.Clear;
      demo := createoleobject('SqlDmo.application');
      save := demo.ListAvailableSQLServers;
      for i := 1 to save.count  do
        self.ComboBox1.Items.Add(save.item(i));
      self.ComboBox1.ItemIndex := 0;
    这样就可以得到局域网内的所有服务器