为什么我的参数化查询与整数字段失败?

时间:2010-07-12 00:12:41

标签: delphi delphi-7 bde dbase

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

以下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;

我尝试过各种各样的InstructorNo赋值,例如.Value而不是AsInteger,但它们都会产生相同的错误。

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

函数参数InstructorNo的类型为Integer。

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

编辑:我已经部分解决了这个问题

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

另一个编辑:终于明白了

我必须使用.AsFloat来获取存储的值。虽然对于CustomerID使用float类型字段有点奇怪。

1 个答案:

答案 0 :(得分:1)

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

- 的Jeroen