我使用下面的代码获取SQL Server服务器列表,程序能正常运行,也可以列出服务器名,但在我将SQL Server服务器停止,再运行后,就不能再列出SQL Server服务器名称了,这是为什么呢?是下面的代码不能稳定工作,还是什么其它问题?有其它更好的方法获取SQL Server服务器列表吗?
请高手帮忙,谢谢!!!
SQLServerApp := CreateOleObject('SQLDMO.Application'); ServerList := SQLServerApp.ListAvailableSQLServers; for i := 1 to ServerList.Count do AList.Add(ServerList.Item(i));
请高手帮忙,谢谢!!!
SQLServerApp := CreateOleObject('SQLDMO.Application'); ServerList := SQLServerApp.ListAvailableSQLServers; for i := 1 to ServerList.Count do AList.Add(ServerList.Item(i));
解决方案 »
- Delphi中TreeView的单击事件问题请教
- Socket Error # 10022 Invalid argument错误
- 求助,关于长整型进制转换问题
- 能用一个二维数组把全年的日期和对应的星期几读到里面吗?
- 请问:在TPanel上显示图像后,为什么就不能实现拖动了?
- depphi中,有無直接輸出到打印機的 command 如何,如dos 下的 ???
- 关于OleContainer的问题,我急死了,解决,要多少分给多少分.
- 请问怎么调用WIN 系统的那个运行!??
- 谁有installshield express5.0EvalSp2的激活序列号啊,急!!
- 有人用EDI做电子商务吗?
- 今天终于骗了点分数,散分~~~~~~~~~
- 谁有往表里插入记录的例子
谢谢你的回答,我又反复试了一下,确实如此。我怀疑是我的程序出的问题,又从网上下了一个“SQL Server数据库安装程序04225修正版”,这是一个完整的源代码,采用的是同一个方法列服务器,此程序的表现与我的程序是一样的,可见是方法上有点问题,或者是还有些问题没考虑到。
能再给我点建议吗?谢谢!!!
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
你好,谢谢你的回答!我看了一下你的程序其方法和原理与我使用的是一样的,所以我没有再用你的程序试,但我发现SQL服务器停止或运行后经过一段好长时间后,程序就可列出服务器名了,于是我做了一个搜索计时程序,即在列不出服务器时,再执行列表程序,如此循环,直到列出服务器为止,并记下这一段时间,结果发现在服务器停止再运行后约需12分钟才能列出服务器,而在此期间,服务器确实可用,运行数据库程序也没有问题,经过反复测试均是如此,不知是什么原因。为什么服务可用但列不出服务器呢?有谁能解释一下吗?怎样在第一时间才能得到服务器列表呢?真是伤脑筋!!!