Компонент 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)';
И ваш запрос будет быстрее, поскольку оператор может быть подготовлен движком, а затем использован повторно.