如何獲取局域網中的所有 SQL Server 服務 作者:佚名 我一直想在我的應用程序中獲得關于 SQL Server 更詳細的信息。直到最近利用 SQLDMO(SQL Distributed Management Objects) 才得以實現這個想法。SQLDMO 提供了非常強大的功能,我們幾乎可以利用程序實現任
如何獲取局域網中的所有 SQL Server 服務
作者:佚名
我一直想在我的應用程序中獲得關于 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.
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com