由于特殊需要,现有一个var a,b:_Connection;变量 变量a已经和数据库建立连接,现需要克隆一个连接给b,请教高手该如何实现?用b := a;这样不可以,这样当b关闭时,a也关闭了。

解决方案 »

  1.   

    你说的关闭,是调_Connection的close方法?
    a和b都是接口指针而已, b := a; 这样的话,他们共用的是一个连接.
    你想做到a关闭,而b不关闭,只能这样: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;
    procedure TForm1.FormCreate(Sender: TObject);
    var
      a, b: _Connection;
    begin  b := CreateADOObject(CLASS_Connection) as _Connection;
      b.Open(a.ConnectionString, 'yourUserID', 'YourPassword', 0);  //第三个参数: 0:同步方式  1: 异步方式end;
      

  2.   

    对了,uses
      ActiveX, ADOConst, ComObj, ADOInt;
      

  3.   

    _Connection = interface(Connection15)接口无Assign方法,好像无法达到克隆效果!
    需要另创建一下接口,具体实现看一下adoconnection的VCL源码的构造函数,其内有创建过程