0

我使用 Delphi/NexusDB 并在运行时构建 SQL(大约 800 个字符长),然后将其传递给 nexusdb query.sql.text 属性以执行它,但我发现执行时令牌无效的错误。

我这样传递SQL

Query.SQL.Text := VarStrSQL; // <<---- string variable holding the SQL

当我追踪时,我发现 Query.SQL.Text 中的 SQL 字符串被修剪为 326 个字符!虽然保存 SQL 的字符串变量是完整且正常的,但是当我将该变量分配给 query.sql.text 时,只传递了 326 个字符,当然这会导致无效 SQL 语法错误

请告知为什么这样修剪 SQL 字符串?

更新: *我尝试了 memo1.lines.text := VarStrSQL 并且备忘录组件也显示了修剪的字符串!我的字符串中有可能是一个字符吗?Delphi 2010 中导致 TStrings 修剪我的字符串的错误?*

谢谢

4

2 回答 2

3

听起来像是数据库提供程序本身的错误。中没有这样的限制TQuery

我的建议是使用小 SQL,但绑定参数来设置数据。

代替

Query.SQL.Text := 'INSERT INTO Store_Information (store_name, Sales, Date)
VALUES ('Los Angeles ... ... ...', 900, '10-Jan-1999')';

代码

Query.FieldByName('store').AsString := 'Los Angeles ... ... ...'; // here you should have no limitation
Query.FieldByName('sales').AsInteger := 900;
Query.FIeldByName('Date').AsDAteTime := Now;
Query.SQL.Text := 'INSERT INTO Store_Information (store_name, Sales, Date)
VALUES (:store,:sales,:date)';

而且您的请求会更快,因为该语句可以由引擎准备,然后重用。

于 2012-02-11T08:49:33.930 回答
0

我发现了问题:它是 nxtChar 字段,当它们为空时,它们的值为 #0 并导致字符串修剪

然而,虽然我检查 null 像这样 varisnull() char 字段能够跳过这个陷阱函数!这让我自己绕了几个小时终于我现在像这样检查它们

If <nxtChar field> = #0 then <nxtChar field> = '' (or <nxtChar field> = null)
于 2012-02-11T12:28:08.570 回答