RSS
热门关键字:  数据挖掘  人工智能  数据仓库  搜索引擎  数据挖掘导论

如何获取局域网中的所有SQLServer服务器

来源: 作者:unkonwn 时间:2005-08-12 点击:

如何获取局域网中的所有 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;

数据挖掘研究院

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.

数据挖掘研究院

  数据挖掘实验室

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?