Delphi / Query组件 - 将一个长字符串(800 char)分配给sql.text属性,仅将sql修剪为326 char

时间:2012-02-11 04:11:40

标签: string delphi nexusdb

我使用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,而memo组件也显示修剪过的字符串!!我的字符串中的字符是否可能导致!! Delphi 2010中的一个错误导致TStrings修剪我的字符串? *

由于

2 个答案:

答案 0 :(得分: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)';

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

答案 1 :(得分:0)

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

然而,虽然我像这个varisnull()一样检查null,但char字段能够跳过这个陷阱功能!这让我自己走了几个小时,最后我现在就像这样检查它们

If <nxtChar field> = #0 then <nxtChar field> = '' (or <nxtChar field> = null)