4

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タイプのフィールドを使用するのは少し奇妙ですが。

4

1 に答える 1

1

.AsInteger を介して値を割り当てることにより、パラメーターは 4 バイトの整数としてマークされます。
これは 2 バイトの dBase 整数には収まりません (4 桁の整数は 2 バイトです)。
したがって、エラーメッセージ。

--jeroen

于 2010-07-21T21:52:48.577 に答える