极度郁闷中... 求教:三层COM+(没用Midas)中,为什么我在Initialize中初始化的变量,在同一对象中,访问不了?
gub 2004-01-03 01:50:45 COM+三层,未使用Midas,使用的ADO原生对象。
其中一个Transactional Object: DBAgent. 用来访问数据库。
(一)
1.1 首先我定义了一个Private的Con: _Connection,
并在DBAgent的Initialize(overload)中,把它打开。
Con := CoConnection.Create;
ConStr := 'Provider=SQLOLEDB.1;Initial Catalog=DocuMan;Data Source=GUB';
Usr := 'sa';
Pwd := 'XX';
Con.Open(ConStr, Usr, Pwd, adConnectUnspecified);
1.2 然后,在我的一个接口方法中使用它。
procedure TDBAgent.GetRS(const aComTxt: WideString; var vRS: _Recordset);
begin
try
// vRS.Set_ActiveConnection(Con); //这句加不加 下场一样。
vRS.Open(aComTxt, Con, adOpenStatic, adLockBatchOptimistic, adCmdText);
SetComplete;
except
SetAbort;
end;
end;
1.3 在客户端,
procedure TForm1.Button1Click(Sender: TObject);
var
AgntObj: IDBAgent;
rs: _RecordSet;
begin
AgntObj:= CoDBAgent.Create;
rs := CoRecordSet.Create;
AgntObj.GetRS('Select * from T_Box',rs);
...
end;
下场:
客户端得不到Recordset.
(二)
2.1 直接在接口方法中指定ConStr
Constr := '连接字符串';
vRS.Open(aComTxt, Constr, adOpenStatic, adLockBatchOptimistic, adCmdText);
其他不变。
结果:
客户端可以得到RecordSet.
(三)
3.1 定义了一个Private(Protected/Public我也试了)的ConStr: string;
(为什么不用ResourceString? 因为我不想写死ConnectionString,我要从Registry中获得它)
3.2 分别在Initialize和OnActivate中,对它进行初始化。
Constr := '连接字符串';
3.3 把接口方法中对Constr 的赋值 一句去掉。
下场:
还是得不到RecordSet.
(四)
4.1 索性添加一个借口方法GetConStr返回 BSTR
4.2 分别在Initialize和OnActivate中,对它进行初始化。
Constr := '连接字符串';
4.3 客户端
procedure TForm1.Button1Click(Sender: TObject);
var
AgntObj: IDBAgent;
str: String;
begin
AgntObj := CoDBAgent.Create;
str := AgntObj.GetConStr;
...
end;
下场:
得不到ConStr的值。
(五)
极度郁闷。
(六)
求救!!!!!