delphi adoconnection econvert 错误

问题描述 投票:0回答:4

我有以下代码引发 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的引用。我想要我自己的对象,这样我就可以释放它,而不释放引用。逻辑很复杂,我需要某种机制来从该引用创建对象。

delphi delphi-7 adoconnection
4个回答
2
投票

您无法将 TADOConnection 分配给 TADOConnection,因为 TADOConnection 类中未实现此类分配。这是很常见的 - 很多类没有实现赋值方法,并且你不能指望任何 TPersistent 后代实现赋值方法 - 通常不需要它。


1
投票

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 返回连接的参数并打开一个新连接...

致以诚挚的问候。


1
投票

wTmpADOConn 参考来自哪里?如果它来自不同的可执行模块(dll)并且未使用包,则 wTmpADOConn 和 Result 的类型将不匹配。


0
投票

根据答案(尤其是 jachguate),我通过分配连接字符串解决了这个问题。代码如下

  Result.ConnectionString:=wTmpADOConn.ConnectionString;
  Result.LoginPrompt:=wTmpADOConn.LoginPrompt;
  Result.Name:=wTmpADOConn.Name;
所有答案都

+1。谢谢你

致以诚挚的问候,

© www.soinside.com 2019 - 2024. All rights reserved.