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
モードになります。
ここで何が悪いのでしょうか?
私は質問と回答の両方を投稿しています。問題の原因は完全に予期しない動作であり、確かに他の誰かが同じ困惑したことを起こしていたからです。
これは、編集しようとしているデータセットにレコードがない場合に発生します。個人的には、レコードがないと編集できないという例外が発生すると思います。しかし、TADOQuery
は代わりに新しいレコードを追加することにしました。
この問題の根本的な原因は、ID
を指定したオブジェクトが実際には0
の値を持っているため、データベースにID 0のレコードがないため、何も返されなかったことです。