首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

大哥们如何获取局域网中的所有 SQL Server 服务器

2012-02-10 
大哥们怎么获取局域网中的所有 SQL Server 服务器大哥们怎么获取局域网中的所有SQLServer服务器用DHLPHI怎

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

[解决办法]
在線等...
[解决办法]
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

[解决办法]
PS:测试通过~~嘿嘿
------解决方案--------------------


这样的问题,可以通过搜索以前帖子的方法解决,很多的。
[解决办法]
很简单,引用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;
这样就可以得到局域网内的所有服务器
[解决办法]
至少有三种方法

热点排行