大哥们怎么获取局域网中的所有 SQL Server 服务器 用DHLPHI怎么写
好象调用SQLDMO_TLB.pas可以实现但是不知道怎么写。
有空件更好了 呵呵
好象调用SQLDMO_TLB.pas可以实现但是不知道怎么写。
有空件更好了 呵呵
解决方案 »
- 关于IdUDPServer监听多个端口
- QReport安装后对着组件类名按Ctrl键加鼠标左键定位不到源码
- 简单问题,进来看看,有分白拿哦。
- 开贴补500分,请 ly_liuyang(Liu Yang) 进来接分(1)
- 请问如何在一个FORM中控制另一个FORM的ONPAINT事件?
- 网上调查,新年到了,想问问大家一年要买多少钱的和编程有关的书,最喜欢哪个出版社的,买了以后不后悔的有几本
- 有没有办法让荧屏内容锁定一段时间再刷新?
- 怎么用SQL语言设定关键字(unique 和 primary key有什么不同)
- 我想学编写游戏!
- 很有难度的一个问题
- odbc,ado,与oracle,sql server的驱动程序有什么区别?请各位赐教?
- 登陆代码问题啊?????找到的进,给点意见和建议
在这里我们需要注意,由于引入的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
然后使用函数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;
这样就可以得到局域网内的所有服务器