4

我有一个 TQuery 对象,指向一个 dBase 数据库,我想知道我应该如何参数化我的插入语句。

以下 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 错误“表达式中的类型错误”而失败:

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;

我尝试了 InstructorNo 分配的各种变体,例如 .Value 而不是 AsInteger,但它们都会产生相同的错误。

“INSTNR”列定义为 Numeric,maxwidth=4,decimal=0。我试图分配的值是 999。

函数参数 InstructorNo 的类型为 Integer。

这是 BDE 中的某种已知错误吗?

编辑:我已经部分弄清楚了

我可以通过使用 .AsSmallInt 而不是 .AsInteger 在某些字段上克服这个问题,但是在另一个数字字段上,Integer、SmallInt 或 Word 都不起作用。解决这个问题的唯一方法是将值手动插入到 SQL 语句中。maxwidth=6 的 dBase Numeric 字段有什么特别之处?

另一个编辑:终于明白了

我不得不使用 .AsFloat 来获取存储的值。虽然对 CustomerID 使用浮点类型字段有点奇怪。

4

1 回答 1

1

通过通过 .AsInteger 分配值,参数被标记为 4 字节整数。
这不适合 2 字节 dBase 整数(4 位整数为 2 字节)。
因此出现错误消息。

——杰伦

于 2010-07-21T21:52:48.577 回答