web-dev-qa-db-ja.com

TADOQuery-編集モードでは、編集ではなく新しいレコードが挿入されます

TADOQueryの動作に戸惑っています。Qを呼び出しましょう。 Q.Editを使用していくつかのフィールドに入力し、次にPostを使用すると、実際には新しいレコードが挿入されます。

コードは単純で、オブジェクトからIDを読み取ります。

Q.SQL.Text := 'select * from SomeTable where ID = :id';
Q.Parameters.ParamValues['id'] := MyObject.ID;
Q.Open;
try
  Q.Edit;
  try
    Q['SomeField']:= MyObject.SomeField;
  finally
    Q.Post;
  end;
finally
  Q.Close;
end;

驚いたことに、目的のレコードを更新するのではなく、新しいレコードを挿入することにしました。 Q.Editの直後のコードをステップ実行すると、クエリは実際にはInsertモードになります。

ここで何が悪いのでしょうか?

7
Jerry Dodge

私は質問と回答の両方を投稿しています。問題の原因は完全に予期しない動作であり、確かに他の誰かが同じ困惑したことを起こしていたからです。

これは、編集しようとしているデータセットにレコードがない場合に発生します。個人的には、レコードがないと編集できないという例外が発生すると思います。しかし、TADOQueryは代わりに新しいレコードを追加することにしました。

この問題の根本的な原因は、IDを指定したオブジェクトが実際には0の値を持っているため、データベースにID 0のレコードがないため、何も返されなかったことです。

0
Jerry Dodge