我有以下代码提出EConvertError - “无法将TAdoConnection分配给TAdoConnection”
var
wTmpADOConn : TADOConnection;
begin
//
Result := nil;
try
Result := TADOConnection.Create(nil);
wTmpADOConn := afunc(aNameConn);//aFunc-Function which returns a pointer to a TADOConnection object, aNameConn - string- the name of connection
if wTmpADOConn <> nil then
begin
Result.Assign(wTmpADOConn);//here the error is raising
我无法理解我做错了什么。我试图将变量wTmpADOConn转换为TAdoConnection或TPersistent,但没有成功。
我知道复制对象时可以使用Assign过程。
代码是用Delphi 7编写的。
LE:谢谢大家,问题是该对象是一个共享对象,是对另一个ADOConnection的引用。我想要自己的对象,所以我可以释放它,而不需要释放引用。逻辑很复杂,我需要一些机制来从该引用创建一个对象。答案 0 :(得分:2)
您无法将TADOConnection分配给TADOConnection,因为此类分配未在TADOConnection类中实现。这很常见 - 很多类都没有实现Assign方法,你不能指望任何TPersistent后代实现Assign方法 - 通常不需要它。
答案 1 :(得分:1)
wTmpADOConn参考来自哪里?如果它来自不同的可执行模块(dll)并且没有使用packeges,则wTmpADOConn和Result的类型将不匹配。
答案 2 :(得分:1)
TAdoConnection(与其他“连接”类一样)不仅仅是分配内存的块。通常它包含活动资源的句柄或其他状态信息,例如与数据库的开放连接,打开的文件等。
连接通常不是为了在不同实例之间共享这种“实时”连接而设计的。
无论如何,如果afunc返回一个新创建的连接而不是一个共享对象,你可以只返回创建的连接。如果afunc返回nil,则创建一个新的,如下所示:
var
wTmpADOConn : TADOConnection;
begin
Result := afunc(aNameConn);//aFunc-Function which returns a pointer to a TADOConnection object, aNameConn - string- the name of connection
if Result <> nil then
Result := TADOConnection.Create(nil);
当然,你的逻辑可能很复杂......我只是在玩你从函数中展示的东西......
另一种方法是重新使用aFunc返回连接的参数并打开一个新的...
最好的问候。
答案 3 :(得分:0)
基于答案(尤其是jachguate),我通过分配连接字符串来解决它。代码吼叫
Result.ConnectionString:=wTmpADOConn.ConnectionString;
Result.LoginPrompt:=wTmpADOConn.LoginPrompt;
Result.Name:=wTmpADOConn.Name;
所有答案都是+1。谢谢
最好的问候,