为什么我的带有整数字段的参数化查询失败?
我有一个 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”定义为数字,最大宽度=4,小数=0。我尝试分配的值为 999。
函数参数 InstructorNo 的类型为 Integer。
这是 BDE 中的某种已知错误吗?
编辑:我已经部分解决了这个问题
我可以通过使用 .AsSmallInt 而不是 .AsInteger 在某些字段上克服这个问题,但是在另一个数字字段上,Integer、SmallInt 或 Word 都不起作用。解决这个问题的唯一方法是手动将值插入到 SQL 语句中。 maxwidth=6 的 dBase 数字字段有什么特别之处?
另一个编辑:终于明白
我必须使用 .AsFloat 来获取存储的值。尽管对 CustomerID 使用浮点类型字段有点奇怪。
I have a TQuery object, pointed to a dBase database and I'm wondering how I should go about parameterizing my insert statement.
The following INSERT-query will will work fine with 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;
But, this fully parameterized version fails with BDE error 'Type mismtach in expression':
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;
I have tried various variations of the assignment of InstructorNo, such as .Value instead of AsInteger, but they all produce the same error.
The column 'INSTNR' is defined as Numeric, maxwidth=4, decimals=0. The value I'm attempting to assign is 999.
The function parameter InstructorNo is of type Integer.
Is this some kind of known bug in BDE?
EDIT: I have partly figured this one out
I can overcome this issue on some of the fields by using .AsSmallInt instead of .AsInteger, however on another numeric field neither Integer, SmallInt or Word works. The only way around that was to manually insert the value into the SQL statement. What's so special with a dBase Numeric field with maxwidth=6 ?
ANOTHER EDIT: Finally got it
I had to use .AsFloat to get the value stored. Though a bit weird to use a float type field for a CustomerID.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
通过通过 .AsInteger 分配值,参数将被标记为 4 字节整数。
这不适合 2 字节 dBase 整数(4 位整数为 2 字节)。
因此出现错误消息。
——杰罗恩
By assigning the value through .AsInteger, the parameter gets marked as a 4-byte Integer.
That will not fit in a 2-byte dBase integer (4 position integer is 2 bytes).
Hence the error message.
--jeroen