3

TDataSetProvider に接続された TClientDataSet があり、それが TAdsQuery に接続されています。SQL コマンドを設定してから、次のように ClientDataset を開きます。

try
  CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1';
  CDS.Open
except
  // trap exception here - this never gets executed!
end;

ただし、CommandText の SQL ステートメントが失敗した場合 (構文エラーなど)、Advantage コード内で例外が発生しますが、独自の例外処理コードではキャッチされません。

このエラーをトラップしてユーザーに適切に報告する方法はありますか? または、実行する前に SQL クエリの構文を確認する方法はありますか?

Delphi Pro 2009 と Advantage Local Server 9 を使用しています。

4

4 に答える 4

3

Advantage には、発生した例外に関する詳細情報を提供するEADSDatabaseErrorが含まれています。

try
  CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1';
  CDS.Open
except
on E: EDatabaseError do
begin
  if ( E is EADSDatabaseError ) then
  begin
    ErrorString := (E as EADSDatabaseError).SQLErrorCode + E.Message;
    application.messagebox ( pchar(ErrorString), 'Advantage Database Error', 0 )
  end
  else
    application.messagebox (pchar(E.message), 'Native Database Error', 0 );
  end;
end;

TAdsQuery コンポーネントのVerifySQLメソッドを使用すると、実行前に SQL ステートメントの構文をチェックできます。これにより、SQL 構文が正しくない場合、EADSDatabaseError 例外が発生します。

于 2010-05-13T14:22:35.850 に答える
2

これを IDE 内から実行している場合、または実行可能ファイルから直接実行している場合に、例外コード (必要なトラップされた例外ではない) を取得していますか? 私が尋ねる理由は、IDE が最初にエラー/例外を報告し、続行しない場合、実際の例外トラップが表示されないためです。

特定のエラー タイプの IDE トラップをオフにすることは可能ですが、私はそうするのは好きではありませんが、平均的にはそうです。これが問題かどうかを確認するには、Delphi IDE の外部でアプリケーションを単独で実行します。

また、最初に作成したコードは、すべてのエラーが表面に出ないようにする必要がありますが、これはおそらく望んでいないことです。同様に、見栄えを良くしたい場合は、以下のようにメッセージを表示して処理することができます。

try 
  CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1'; 
  CDS.Open 
except 
  on E: Exception do begin
    ShowMessage(E.Message);
    // optionally Exit, Abort or what else, to stop execution of the next statements
  end;
end;
于 2010-05-13T14:10:48.823 に答える
1

TClientDataSet でコマンド テキストを設定している理由がわかりません。TAdsQuery.SQL プロパティを設定してから TClientDataSet を開くと、探している動作が得られると思います。

これを設定してコードを実行すると、「CommandText の変更は許可されていません」という例外が発生しました。

procedure TForm57.Button1Click(Sender: TObject);
begin
  try
   CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1';
   CDS.Open;
  except
    on E : Exception do
      ShowMessage( 'got it:' + E.message );
  end;
end;
于 2010-05-13T14:19:27.430 に答える
0
  1. SQL コマンドを実行するには、TAdsTable の代わりに TAdsQuery を使用する必要があります。
  2. TAdsTable がエラーを返さないのは奇妙です。「未知のテーブル」のようなものを言うべきです。
  3. エラーをトラップしてユーザーに報告するには:
    
        try 
          CDS.CommandText := 'SELECT * FROM tablename WHERE fieldname = 1'; 
          CDS.Open 
        except 
          on E: Exception do begin
            Application.HandleException(Self);
            // optionally Exit, Abort or what else, to stop execution of the next statements
          end;
        end;
    
  4. SQL クエリの構文を確認する簡単な方法はありません。その場合、複雑なプログラミング タスクである DBMS パーサーの動作を再現する必要があるためです。より簡単なのは、コマンドが正しいことを期待して、DBMS にコマンドを送信することです (楽観的なアプローチ)。
于 2010-05-13T07:52:41.690 に答える