Forum > Russian

Lazarus 2.0.0.RC3 - ошибка в Sequence для SQLite: Near FOR syntaх error

(1/2) > >>

Patro de Nordo:
Зарегистрировался чтобы об ошибке сообщить. Вдруг поможет.
Lazarus 2.0.0.RC3
Используется SQLite 3.2.5
Win32

TSQLite3Connection.GetNextValue(...)  ругается near "FOR": syntax error.
Та же самая ошибка возникает, если использовать редактируемый ТSQLQuery, у которого указать Sequence. Ошибка возникает после вызова Post для вставляемой записи.

Это как-то можно обойти или починить?

sash:
Не пользуюсь SQLite, но было бы лучше описать проблему полнее.

Patro de Nordo:
Разобрался, как включить протоколирование запросов и уточнил проблему. При использовании Sequence пытается выполнить запрос:

--- Code: SQL  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---SELECT NEXT VALUE FOR <sequencename> Но этот запрос некорректен для SQLite.
Ругается как я описал выше.
Выполнение такого запроса происходит если явным образом у компонента TSQLite3Connection вызвать метод GetNextValue,
либо если у компонента TSQLQuery заполнить свойство Sequence и попытаться сохранить новую запись.

Приемлемый запрос вместо ошибочного может выглядеть примерно так:

--- Code: SQL  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---SELECT seq+1 FROM sqlite_sequence WHERE name=<sequencename> С его помощью я смог обойти проблему, отключив в компоненте TSQLQuery использование Sequence и просто заполняя автоинкрементное поле с помощью этого запроса на событии BeforePost.

Patro de Nordo:
Поиском по исходникам локализовал проблему:
sqldb.pp строка 2000

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---function TSQLConnection.GetNextValueSQL(const SequenceName: string; IncrementBy: Integer): string;begin  Result := 'SELECT NEXT VALUE FOR ' + SequenceName;end; Очевидно, что этот метод должен быть переопределен для TSQLite3Connection (файл sqlite3conn.pp), но это не сделано.
Собственно, вот и способ исправления нарисовался.
Могу сам себе поправить, но может кто-нибудь сможет донести это до разработчиков, чтобы в релизе поправили?

HuntingKashket:

--- Quote from: wanderus on February 01, 2019, 10:46:48 am ---Поиском по исходникам локализовал проблему:
sqldb.pp строка 2000

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---function TSQLConnection.GetNextValueSQL(const SequenceName: string; IncrementBy: Integer): string;begin  Result := 'SELECT NEXT VALUE FOR ' + SequenceName;end; Очевидно, что этот метод должен быть переопределен для TSQLite3Connection (файл sqlite3conn.pp), но это не сделано.
Собственно, вот и способ исправления нарисовался.
Могу сам себе поправить, но может кто-нибудь сможет донести это до разработчиков, чтобы в релизе поправили?

--- End quote ---

With search in sources i localized the problem:
sqldb.pp string 2000

--- Code: Text  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---function TSQLConnection.GetNextValueSQL(const SequenceName: string; IncrementBy: Integer): string;begin  Result := 'SELECT NEXT VALUE FOR ' + SequenceName;end; This code isn't correct for sqlite3, which faults with <<near "FOR": syntax error.>>
Obviously, this method must be redeclared for TSQLite3Connection (file sqlite3conn.pp), but this isn't done.
Please, redeclare this with something like

--- Code: MySQL  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---SELECT seq+1 FROM sqlite_sequence WHERE name=<sequencename> -- Translation & summary from wanderus

Please, someone, pay attention to this bug.

Navigation

[0] Message Index

[#] Next page

Go to full version