代码之家  ›  专栏  ›  技术社区  ›  RBA

delphi adoconnection econvert错误

  •  2
  • RBA  · 技术社区  · 14 年前

    我有以下代码,它引发了一个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
    

    我不明白我做错了什么。我试图转换为TAdoConnection或t持久化变量wTmpADOConn,但没有成功。

    我知道复制对象可以使用赋值过程。

    代码是用Delphi7编写的。

    4 回复  |  直到 8 年前
        1
  •  2
  •   kludg    14 年前

    不能将TADOConnection分配给TADOConnection,因为TADOConnection类中没有实现这种分配。这是很常见的——很多类都没有实现Assign方法,而且您也不能期望任何TPersistent子体实现Assign方法——通常不需要它。

        2
  •  1
  •   Igor    14 年前

    wTmpADOConn引用从何而来?如果它来自不同的可执行模块(dll),并且没有使用包,则wTmpADOConn和Result的类型将不匹配。

        3
  •  1
  •   jachguate    14 年前

    TAdoConnection(和其他“connection”类一样)不仅仅是一个分配的内存块。通常它包含句柄或其他状态信息 资源,如打开的数据库连接、打开的文件等。

    无论如何,如果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返回连接的参数并打开一个新连接。。。

    谨致问候。

        4
  •  0
  •   RBA    14 年前

    基于答案(特别是jachgute),我通过分配连接字符串解决了这个问题。代码如下

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

    谨致问候,