Компонент Delphi/Query - назначьте длинную строку (800 символов) свойству sql.text, обрезав значение sql до 326 символов

Я использую Delphi/NexusDB и строю SQL (длиной около 800 символов) во время выполнения, затем передаю его свойству nexusdb query.sql.text для выполнения, но обнаружил ошибку неверного токена при выполнении.

Я передаю SQL, как это

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

когда я проследил, я нашел строку SQL в Query.SQL.Text обрезается до 326 символов! Хотя строковая переменная, которая содержит SQL, полна и хорошо, но когда я назначаю эту переменную для query.sql.text, передается только 326 символов, и, конечно, это приводит к ошибке из-за неверного синтаксиса SQL

Посоветуйте, пожалуйста, почему строка SQL обрезана таким образом?

Обновление: * Я попробовал memo1.lines.text:= VarStrSQL, и компонент memo также отображает усеченную строку!! возможно ли, что символ в моей строке вызывает это!! ошибка в Delphi 2010, из-за которой TStrings урезал мою строку? *

Спасибо

2 ответа

Решение

Я нашел проблему: это поля nxtChar, когда они равны нулю, они имеют значение #0, и это вызывает обрезку строки

однако, хотя я проверяю на null, как это, varisnull() поля char смогли пропустить эту функцию trap!!! что заставляет меня ходить вокруг себя в течение нескольких часов, наконец, теперь я проверяю их вот так

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

Похоже, ошибка в самом поставщике БД. Там нет такого ограничения в 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)';

И ваш запрос будет быстрее, поскольку оператор может быть подготовлен движком, а затем использован повторно.

Другие вопросы по тегам