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

何が間違っているのか理解できません。TAdoConnectionまたはTPersistentに変数wTmpADOConnをキャストしようとしましたが、成功しませんでした。

オブジェクトをコピーするには、Assignプロシージャを使用できることを知っています。

コードはDelphi7で書かれています。

LE:ありがとうございます。問題は、オブジェクトが共有オブジェクトであり、別のADOConnectionへの参照であるということです。そして、参照を解放せずに解放できるように、自分のオブジェクトが必要です。ロジックは複雑で、その参照からオブジェクトを作成するためのメカニズムが必要です。

4

4 に答える 4

2

TADOConnectionクラスに実装されていないため、TADOConnectionをTADOConnectionに割り当てることはできません。これは非常に一般的です-多くのクラスはAssignメソッドを実装しておらず、TPersistentの子孫がAssignメソッドを実装することは期待できません-通常は必要ありません。

于 2010-10-25T16:00:50.423 に答える
1

wTmpADOConnリファレンスはどこから来ていますか?別の実行可能モジュール(dll)からのものであり、パッケージが使用されていない場合、wTmpADOConnとResultのタイプは一致しません。

于 2010-10-25T15:45:17.893 に答える
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 に答える
0

回答(特にjachguate)に基づいて、接続文字列を割り当てることで解決しました。以下のコード

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

すべての答えに+1。ありがとうございました

よろしくお願いします、

于 2010-10-27T06:30:35.403 に答える