dBaseデータベースを指すTQueryオブジェクトがあり、挿入ステートメントのパラメーター化をどのように行うべきか疑問に思っています。
次のINSERTクエリはqry.ExecSQLで正常に機能します。
qry.SQL.Text :=
'INSERT INTO KUNDE ' +
'(FNAVN, ENAVN, INSTNR) ' +
'VALUES ' +
'(:FirstName, :LastName, ' + IntToStr(InstructorNo) + ' )';
qry.ParamByName('FirstName').AsString := FirstName;
qry.ParamByName('LastName').AsString := LastName;
しかし、この完全にパラメーター化されたバージョンは、BDEエラー「式にmismtachと入力してください」で失敗します。
qry.SQL.Text :=
'INSERT INTO KUNDE ' +
'(FNAVN, ENAVN, INSTNR) ' +
'VALUES ' +
'(:FirstName, :LastName, :InstructorNo)';
qry.ParamByName('FirstName').AsString := FirstName;
qry.ParamByName('LastName').AsString := LastName;
qry.ParamByName('InstructorNo').AsInteger := InstructorNo;
AsIntegerの代わりに.Valueなど、InstructorNoの割り当てのさまざまなバリエーションを試しましたが、すべて同じエラーが発生します。
列'INSTNR'は、数値、maxwidth = 4、decimals=0として定義されます。割り当てようとしている値は999です。
関数パラメーターInstructorNoは整数型です。
これはBDEのある種の既知のバグですか?
編集:私はこれを部分的に理解しました
.AsIntegerの代わりに.AsSmallIntを使用することで、一部のフィールドでこの問題を解決できますが、別の数値フィールドでは、Integer、SmallInt、またはWordのいずれも機能しません。これを回避する唯一の方法は、SQLステートメントに値を手動で挿入することでした。maxwidth =6のdBaseNumericフィールドの何が特別なのですか?
別の編集:ついにそれを手に入れました
値を保存するには、.AsFloatを使用する必要がありました。CustomerIDにfloatタイプのフィールドを使用するのは少し奇妙ですが。