我使用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修剪我的字符串? *
由于
答案 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)