我使用下面的代码获取SQL Server服务器列表,程序能正常运行,也可以列出服务器名,但在我将SQL Server服务器停止,再运行后,就不能再列出SQL Server服务器名称了,这是为什么呢?是下面的代码不能稳定工作,还是什么其它问题?有其它更好的方法获取SQL Server服务器列表吗?
    请高手帮忙,谢谢!!!
    SQLServerApp := CreateOleObject('SQLDMO.Application');    ServerList := SQLServerApp.ListAvailableSQLServers;    for i := 1 to ServerList.Count do      AList.Add(ServerList.Item(i));

解决方案 »

  1.   

    cqbonny:
      谢谢你的回答,我又反复试了一下,确实如此。我怀疑是我的程序出的问题,又从网上下了一个“SQL Server数据库安装程序04225修正版”,这是一个完整的源代码,采用的是同一个方法列服务器,此程序的表现与我的程序是一样的,可见是方法上有点问题,或者是还有些问题没考虑到。
      能再给我点建议吗?谢谢!!!
      

  2.   

    好像以前有发过这段代码:     
     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   
      

  3.   

    mdejtod(稻草人) :
        你好,谢谢你的回答!我看了一下你的程序其方法和原理与我使用的是一样的,所以我没有再用你的程序试,但我发现SQL服务器停止或运行后经过一段好长时间后,程序就可列出服务器名了,于是我做了一个搜索计时程序,即在列不出服务器时,再执行列表程序,如此循环,直到列出服务器为止,并记下这一段时间,结果发现在服务器停止再运行后约需12分钟才能列出服务器,而在此期间,服务器确实可用,运行数据库程序也没有问题,经过反复测试均是如此,不知是什么原因。为什么服务可用但列不出服务器呢?有谁能解释一下吗?怎样在第一时间才能得到服务器列表呢?真是伤脑筋!!!