//sql server 表列function SqlServerList(var sqllist:Tstringlist):bool ; var SQLServer:Variant; ServerList:Variant; i,nServers:integer; begin SQLServer := CreateOleObject('SQLDMO.Application'); ServerList:= SQLServer.ListAvailableSQLServers; sqllist:=Tstringlist.Create; if ServerList.count<1 then begin result:=false; exit; end else result:=true; sqllist.Clear; for i:=1 to serverlist.count do sqllist.Add(serverlist.item(i)) ; end;
procedure TForm1.Button5Click(Sender: TObject); var SQLServer:Variant; ServerList:Variant; i:integer; begin SQLServer := CreateOleObject('SQLDMO.Application'); ServerList:= SQLServer.ListAvailableSQLServers; for i := 1 to ServerList.Count do ComboBox1.Items.Add(ServerList.Item(i)); //Add SQL Server Name to ComboBox1 if ServerList.Count>0 then ComboBox1.ItemIndex:=0; SQLServer:=NULL; serverList:=NULL; end;
谢谢楼上的两位.但是你们的代码怎么用? 是不是还要引用别的unit?
uses ComObj; 返回sql server 列表在 sqllist:Tstringlist中 .
在这里我们需要注意,由于引入的SQLDMO “TDatabase”和 “TApplication”和其它几个缺省类名与 Delphi 自带的类名冲突,所以自己可以修改成 _TypeName 的形式。或者其它的名字,我在这里改成 T_Application 、T_Database 等。我们下一步要做的是在我们的程序中引入单元文件 SQLDMO_TLB.PAS 。 应用程序单元名称是 SqlServers 程序运行界面如下:
服务器列表中是局域网中所有的 SQL SERVER 服务器,选择服务器后输入用户名和密码,下拉数据库列表,程序会列出此服务器中的所有数据库.程序源代码如下:unit SqlServers;interfaceuses 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 ;endend
请帮忙看看
你能发一份能运行的代码及窗体文件给我吗?
这个好像有些问题[email protected]谢谢!
var
SQLServer:Variant;
ServerList:Variant;
i,nServers:integer;
begin
SQLServer := CreateOleObject('SQLDMO.Application');
ServerList:= SQLServer.ListAvailableSQLServers;
sqllist:=Tstringlist.Create;
if ServerList.count<1 then
begin
result:=false;
exit;
end
else
result:=true;
sqllist.Clear;
for i:=1 to serverlist.count do
sqllist.Add(serverlist.item(i)) ;
end;
var
SQLServer:Variant;
ServerList:Variant;
i:integer;
begin
SQLServer := CreateOleObject('SQLDMO.Application');
ServerList:= SQLServer.ListAvailableSQLServers; for i := 1 to ServerList.Count do
ComboBox1.Items.Add(ServerList.Item(i)); //Add SQL Server Name to ComboBox1 if ServerList.Count>0 then
ComboBox1.ItemIndex:=0; SQLServer:=NULL;
serverList:=NULL;
end;
是不是还要引用别的unit?
返回sql server 列表在 sqllist:Tstringlist中 .