我的程序里连接Oracle和SQL Server 2000两个数据库,使用的是ADOConnection连接,请问如何获得局域网内的Oracle和SQL Server服务器名称和服务器上的数据库名称,希望大家多多指教,多谢了!

解决方案 »

  1.   

    如果你不知道具体的ip地址,但是你们都在同一个工作组里面的话,你用adoconn连接的时候,可以在数据链接属性里面看到的
      

  2.   

    sql server 取得数据库名称
    select name from sysdatabases
      

  3.   

    用到sqldmo.dll
    unit SqlServers;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,SQLDMO_TLB, StdCtrls, Buttons;
    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 BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
        server_Names : TStringList;
        PdmoObject : array of TdmoObject;
        Function GetAllServers(ServerList : TStringList) : Boolean;
      public
        { Public declarations }
      end;var
      FormServersList: TFormServersList;implementation{$R *.dfm}
    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
        ShowMessage('无法获取服务器列表,可能缺少客户端DLL库函数');
        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.BitBtn1Click(Sender: TObject);
    beginend;end.
    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 等
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
       SQLServer:Variant;
       ServerList:Variant;
       i,nServers:integer;
       sRetValue:String;
    begin
      try
        SQLServer := CreateOleObject('SQLDMO.Application');
        ServerList:= SQLServer.ListAvailableSQLServers;
        nServers:=ServerList.Count;
        for i := 1 to nservers do
          ListBox1.Items.Add(ServerList.Item(i));
        SQLServer:=NULL;
        serverList:=NULL;
      except
        ListBox1.Items.add('No SQL SerVer!')
      end;
    end;
      

  5.   

    SQL Server获取服务器名和数据库名已经搞定了,获得局域网内的Oracle服务器名和数据库名有什么办法?还请大家继续支持,谢谢了!