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

发布于 2024-09-08 21:06:00 字数 1213 浏览 8 评论 0原文

我有一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

筱武穆 2024-09-15 21:06:00

通过通过 .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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文