Forum > Russian
Lazarus 2.0.0.RC3 - ошибка в Sequence для SQLite: Near FOR syntaх error
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