我有以下代码引发 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,但没有成功。
我知道要复制对象,可以使用分配过程。
代码是用Delphi 7编写的。
LE:谢谢大家,问题是该对象是共享对象,是对另一个ADOConnection的引用。我想要我自己的对象,这样我就可以释放它,而不释放引用。逻辑很复杂,我需要某种机制来从该引用创建对象。
您无法将 TADOConnection 分配给 TADOConnection,因为 TADOConnection 类中未实现此类分配。这是很常见的 - 很多类没有实现赋值方法,并且你不能指望任何 TPersistent 后代实现赋值方法 - 通常不需要它。
TAdoConnection(与其他“连接”类一样)不仅仅是分配的内存块。通常它包含活动资源的句柄或其他状态信息,例如与数据库的打开连接、打开的文件等。
连接通常不设计为在不同实例之间共享此“实时”连接。
无论如何,如果 afunc 返回一个新创建的连接而不是共享对象,您可以只返回 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 返回连接的参数并打开一个新连接...
致以诚挚的问候。
wTmpADOConn 参考来自哪里?如果它来自不同的可执行模块(dll)并且未使用包,则 wTmpADOConn 和 Result 的类型将不匹配。
根据答案(尤其是 jachguate),我通过分配连接字符串解决了这个问题。代码如下
Result.ConnectionString:=wTmpADOConn.ConnectionString;
Result.LoginPrompt:=wTmpADOConn.LoginPrompt;
Result.Name:=wTmpADOConn.Name;
所有答案都+1。谢谢你
致以诚挚的问候,