2

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

4

4 回答 4

2

您不能将 TADOConnection 分配给 TADOConnection,因为这样的分配没有在 TADOConnection 类中实现。这很常见——很多类没有实现Assign方法,你不能指望任何TPersistent后代实现Assign方法——通常不需要它。

于 2010-10-25T16:00:50.423 回答
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 返回的连接的参数并打开一个新的...

此致。

于 2010-10-25T21:55:43.820 回答
1

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

于 2010-10-25T15:45:17.893 回答
0

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

  Result.ConnectionString:=wTmpADOConn.ConnectionString;
  Result.LoginPrompt:=wTmpADOConn.LoginPrompt;
  Result.Name:=wTmpADOConn.Name;

+1 所有答案。谢谢

此致,

于 2010-10-27T06:30:35.403 回答