您的位置:首页 > 编程语言 > Delphi

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐