就是像ado控件那样,设置数据库连接时,能自动枚举中网络中所有sqlserver的名称,然后可供选择请问这个是如何实现的?找了半天资料也找不到,郁闷

解决方案 »

  1.   

    VB里可以用for each ,delphi就不知道了
      

  2.   

    http://dev.csdn.net/Develop/article/14/14912.shtm如何获取局域网中的所有 SQL Server 服务器文献参考来源:Delphi 深度探索我一直想在我的应用程序中获得关于 SQL Server 更详细的信息。直到最近利用 SQLDMO(SQL Distributed Management Objects) 才得以实现这个想法。SQLDMO 提供了非常强大的功能,我们几乎可以利用程序实现任何 SQL Server 拥有的功能。在这篇文章中我将向您展示如何得到局域网中所有 SQL Servers 服务器、如何连接、如何获得服务器中的所有数据库。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;interfaceuses  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 ;endend
      

  3.   

    代码中好像有些问题  TdmoObject = record这里出错.
    请帮忙看看
      

  4.   

    生成的SQLDMO_TLB.pas中也有问题    property ID: Integer readonly dispid 10;这行提示ID没定义怎么回事?
      

  5.   

    aiirii:
    你能发一份能运行的代码及窗体文件给我吗?
    这个好像有些问题[email protected]谢谢!
      

  6.   

    //sql server 表列function  SqlServerList(var sqllist:Tstringlist):bool ;
    var
      SQLServer:Variant;
      ServerList:Variant;
      i,nServers:integer;
    begin
    SQLServer := CreateOleObject('SQLDMO.Application');
    ServerList:= SQLServer.ListAvailableSQLServers;
    sqllist:=Tstringlist.Create;
    if ServerList.count<1 then
    begin
      result:=false;
      exit;
    end
    else
      result:=true;
       sqllist.Clear;
       for i:=1 to serverlist.count do
      sqllist.Add(serverlist.item(i)) ;
    end;
      

  7.   

    procedure TForm1.Button5Click(Sender: TObject);
    var
      SQLServer:Variant;
      ServerList:Variant;
      i:integer;
    begin
      SQLServer := CreateOleObject('SQLDMO.Application');
      ServerList:= SQLServer.ListAvailableSQLServers;  for i := 1 to ServerList.Count do
        ComboBox1.Items.Add(ServerList.Item(i)); //Add SQL Server Name to  ComboBox1  if ServerList.Count>0 then
        ComboBox1.ItemIndex:=0;  SQLServer:=NULL;
      serverList:=NULL;
    end;
      

  8.   

    谢谢楼上的两位.但是你们的代码怎么用?
    是不是还要引用别的unit?
      

  9.   

    uses ComObj;
    返回sql server 列表在 sqllist:Tstringlist中 .