DELPHI 获取SQLSEVER服务器&断开数据库连接
2012-01-30 11:31
375 查看
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;
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;
相关文章推荐
- 同步复制数据库,当网络问题,服务器间断开连接,复制中断后,自动继续复制的设置
- [DCT]LabVIEW中客户端连接到服务器SQL Server数据库_DSN方式
- C# 如何获取本地数据库SQL Server的数据库服务器名称和数据库名称?然后连接,代码怎么写?
- 4、MySQL 8.0参考手册 连接到服务器并断开连接3.3.1创建和选择数据库
- 只有谷歌浏览器出现:"服务器已断开连接,且未发送任何数据。"
- 数据库连接池应用中数据库服务器断开超时连接的问题
- "报表服务器无法打开与报表服务器数据库的连接。所有请求和处理都要求与数据库建立连接。"错误解决
- VS2008发布WebSite ".rem 已断开连接或不在该服务器上"的解决办法
- JSP 连接 MySQL 数据库&获取数据库数据
- 三层数据库与应用程序服务器的小型介绍(Delphi&amp;BCB)(原创)
- 数据库连接池应用中数据库服务器断开超时连接的问题
- [DCT]LabVIEW中客户端连接到服务器SQL Server数据库_UDL方式
- (转载)表服务器无法打开与报表服务器数据库的连接。所有请求和处理都要求与数据库建立连接。
- 查看本机是否能连接数据库服务器
- C#提升性能"数据库连接打开与关闭"经验分享(附:优化过的DBHelper类) 之配餐系统的开发
- delphi 数据库连接方式
- pl/sql developer 远程连接服务器数据库方法
- JDBC:通过 DriverManager 获取数据库连接
- shd_config ssh设置(解决ssh客户端连接服务器断开)
- 如何获取数据服务器的所有数据库名称?