1、获取局域网中的数据库服务器
function CreateADOObject(const ClassID: TGUID): IUnknown;
var
Status: HResult;
FPUControlWord: Word;
begin
asm
FNSTCW FPUControlWord
end;
Status := CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
CLSCTX_LOCAL_SERVER, IUnknown, Result);
asm
FNCLEX
FLDCW FPUControlWord
end;
if (Status = REGDB_E_CLASSNOTREG) then
raise Exception.CreateRes(@SADOCreateError) else
OleCheck(Status);
end;
function BuildSQLServerList: TStringList;
var
oCon: ADORecordsetConstruction;
oRowset: IRowset;
oSourcesRowset: ISourcesRowset;
oRecordset: _Recordset;
strName: string;
begin
Result:=TStringList.Create;
oRecordset := CreateADOObject(CLASS_Recordset) as _Recordset;
oCon := oRecordset as ADORecordsetConstruction;
oSourcesRowset := CreateComObject(ProgIDToClassID('SQLOLEDB Enumerator')) as ISourcesRowset;
OleCheck(oSourcesRowset.GetSourcesRowset(nil, IRowset, 0, nil, IUnknown(oRowset)));
oCon.Rowset := oRowset;
with TADODataSet.Create(nil) do
try
Recordset := oRecordset;
while not EOF do
begin
if FieldByName('SOURCES_TYPE').AsInteger = DBSOURCETYPE_DATASOURCE then
begin
strName := FieldByName('SOURCES_NAME').AsString;
if strName <> EmptyStr then Result.Add(strName);
end;
Next;
end;
finally
Free;
end;
end;
2、断开数据库连接
function KillDBConnectProc(AServerName, AUserName, APasswd: string;
var ErrMessage: string): Boolean;
const
CConnStr ='Provider=SQLOLEDB.1;Persist Security Info=True;'
+'User ID=%s;Password=%s;Data Source=%s;Initial Catalog=%s;';
CKillProcess = 'kill %d';
CGetPid = 'select spid from [Master].[dbo].[SYSPROCESSES]';
var
oQuery: TADOQuery;
sConnectString: string;
begin
Result := True;
sConnectString := Format(CConnStr,
[AUserName, APasswd, AServerName, 'master']);
oQuery := TADOQuery.Create(nil);
try
oQuery.ConnectionString := sConnectString;
oQuery.SQL.Clear;
oQuery.SQL.Add(CGetPid);
oQuery.Open;
oQuery.First;
with TADOConnection.Create(nil) do
try
ConnectionString := sConnectString;
CommandTimeout := 10000;
LoginPrompt := False;
Connected := True;
while not oQuery.Eof do
try
BeginTrans;
Execute(Format(CKillProcess, [oQuery.FieldByName('spid').AsInteger]));
CommitTrans;
oQuery.Next;
except
on e:Exception do
begin
ErrMessage := e.Message;
Result := False;
end;
end;
finally
Close;
Free;
end;
finally
oQuery.Close;
FreeAndNil(oQuery);
end;
end;