Delphi Adoconnection Econvert Error - PullRequest
       33

Delphi Adoconnection Econvert Error

2 голосов
/ 25 октября 2010

У меня есть следующий код, который вызывает ошибку 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 или TPersistent переменную wTmpADOConn, но безуспешно.

Я знаю, что для копирования объекта может использоваться процедура Assign.

Код написан на Delphi 7.

LE: спасибо всем, проблема в том, что объект является общим объектом, является ссылкой на другое ADOConnection. И я хочу свой собственный объект, чтобы я мог освободить его, не освобождая ссылку. Логика сложная, и мне нужен какой-то механизм для создания объекта из этой ссылки.

Ответы [ 4 ]

2 голосов
/ 25 октября 2010

Вы не можете назначить TADOConnection на TADOConnection, потому что такое назначение не реализовано в классе TADOConnection.Это довольно часто - многие классы не реализуют метод Assign, и вы не можете ожидать, что любой потомок TPersistent реализует метод Assign - обычно в этом нет необходимости.

1 голос
/ 26 октября 2010

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 голос
/ 25 октября 2010

Откуда берется ссылка на wTmpADOConn?Если он из другого исполняемого модуля (dll) и не используются никакие пакеты, типы wTmpADOConn и Result не будут совпадать.

0 голосов
/ 27 октября 2010

основываясь на ответах (особенно jachguate), я решил это, назначив строку подключения. код ниже

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

+ 1 за все ответы. Спасибо

С наилучшими пожеланиями,

...