5

Delphi XE2 を AnyDac コンポーネントと Advantage Database 10 と共に使用しています。私のコードでは、次のようなパラメーター化されたクエリを使用しています。

q.SQL.Text := 'SELECT * FROM Table1 ' +
  'LEFT JOIN Table2 ON (Table1.ID = Table1 .ID_Table2) ' +
  'WHERE ' +
  ':0 BETWEEN Table1.StartAm AND Table1.EndeAm ' +
  'AND Table2 = :1';
q.Params[0].Value := AStartDateTime;
q.Params[1].Value := AIDRessourcenGruppe;
q.Open;

これは例外になります。

Exception der Klasse EADSNativeException mit der Meldung '[AnyDAC][Phys][ADS] エラー 7200: AQE エラー: 状態 = 22018;
NativeError = 2112; [iAnywhere ソリューション][Adv​​antage SQL Engine]Assignment error' aufgetreten.

もちろん、AStartDateTime は有効な Delphi TDateTime 値であり、AIDRessourcenGruppe は整数値です。

興味深いことに、これら 2 つのバリアントは機能します。

q.SQL.Text := 'SELECT * FROM Table1 ' +
  'LEFT JOIN Table2 ON (Table1.ID = Table1 .ID_Table2) ' +
  'WHERE ' +
  ':0 BETWEEN Table1.StartAm AND Table1.EndeAm ' +
  'AND Table2 = :1';
q.Params[0].AsDateTime:= AStartDateTime;
q.Params[1].AsInteger:= AIDRessourcenGruppe;
q.Open;

-

q.SQL.Text := 'SELECT * FROM Table1 ' +
  'LEFT JOIN Table2 ON (Table1.ID = Table1 .ID_Table2) ' +
  'WHERE ' +
  ':SomeDate BETWEEN Table1.StartAm AND Table1.EndeAm ' +
  'AND Table2 = :ID_PT_Ressourcengruppe';
q.ParamByName('SomeDate').Value := AStartDateTime;
q.ParamByName('ID_PT_Ressourcengruppe').Value := AIDRessourcenGruppe;
q.Open;

私は何かが恋しいですか?助けてくれてありがとう!

4

1 に答える 1

3

答え - 推測:

パラメータのプロパティへのインデックス付き書き込みアクセスValueはパラメータのデータ型を決定しませんが、名前付きアクセスは決定します。それが正しい場合はVariant、クエリを実行する前に適切な値形式に変換する必要がある型を介してすべての値を渡しているため、問題が発生しています。しかし、それはすべて私の推測にすぎません。AnyDAC についてはまったく知りません。

AsType 値へのアクセス:

Valueパラメータへのアクセスがプロフェッショナルと呼ばれるのが好きではないという理由だけでこれを投稿しています:-)少なくとも次
の理由で、型キャストを使用する方が良いです:AsType

  • 特定のパラメーターに渡す型を直接指定するため、クエリ パラメーター エンジンはこれを決定する必要がなく、アクセスと比較して、型Valueを変換する必要がないため、高速です。Variant

  • たとえば、文字列値をアクセスされたパラメーターに渡すことができないため、より安全ですAsDateTime。したがって、パラメーターの不一致に対する追加の保護があります。

あなたの例で私が推奨するのは、アクセスの前にパラメーターリストを検索する必要があり、遅い一般的に使用される名前付きの代わりに、パラメーターへのインデックス付きアクセスを使用することです。

于 2012-08-23T11:21:03.030 に答える