DELPHI 获取SQLSEVER服务器&断开数据库连接

本文介绍了如何在DELPHI中获取局域网内的SQLSERVER数据库服务器列表,并展示了断开数据库连接的函数实现,包括建立ADO对象、遍历数据源和终止进程的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值