Ошибка SQLConnection: near "index": syntax error
Пишу программу на Лазарусе. Бд на языке SQLite. При нажатии кнопки хочу обновить данные в бд и делаю следующее:
fAuto.SQLQ.Close;
fAuto.SQLQ.SQL.Clear;
fAuto.SQLQ.SQL.Text := 'update books set ISBN=:ISBN, book_name=:BN, author=:A, original_name=:ON, original_language=:OL, publisher_name=:PN, translator=:T, issue_year=:IY, page_count=:PC, book_count=:BC, book_price=:BP, only_for_reading_room=:OFRR, comment=:C where index=:I';
fAuto.SQLQ.ParamByName('ISBN').AsString := eISBN.Text;
fAuto.SQLQ.ParamByName('BN').AsString := eBookName.Text;
fAuto.SQLQ.ParamByName('A').AsString := eAuthor.Text;
fAuto.SQLQ.ParamByName('ON').AsString := eOriginalName.Text;
fAuto.SQLQ.ParamByName('OL').AsString := eOriginalLanguage.Text;
fAuto.SQLQ.ParamByName('PN').AsString := ePublisherName.Text;
fAuto.SQLQ.ParamByName('T').AsString := eTranslator.Text;
fAuto.SQLQ.ParamByName('IY').AsString := eIssueYear.Text;
fAuto.SQLQ.ParamByName('PC').AsInteger := ePageCount.Value;
fAuto.SQLQ.ParamByName('BC').AsInteger := eBookCount.Value;
fAuto.SQLQ.ParamByName('BP').AsString := eBookPrice.Text;
fAuto.SQLQ.ParamByName('OFRR').AsBoolean := eOFRR.Checked;
fAuto.SQLQ.ParamByName('C').AsString := eComment.Lines.Text;
fAuto.SQLQ.ParamByName('I').AsInteger := strtoint(eIndex.Text);
fAuto.SQLQ.ExecSQL;
fAuto.SQLTransaction.Commit;
fAuto.SQLQ.Close;
После нажатия на кнопку программа останавливается на fAuto.SQLQ.ExecSQL и выдает ошибку
SQLConnection: near "index": syntax error
Ответы (1 шт):
Ответ:
В ходе совместных исследований выяснилось, что проблема заключается в index и это слово является ключевым По этой причине запрос не мог правильно интерпретировать часть where index=xxx так как это слово для работы с индексацией таблиц (CREATE INDEX, DROP INDEX). Лучше всего в этом случае использовать имя id так как оно фактически является стандартом для обозначения индексных полей.
Первоначальные догадки:
У Вас ошибка в формировании запроса. По всей вероятности в eIndex.Text пусто или не число, это возможная ошибка рядом с index - о чем и написано в сообщении:
SQLConnection: near "index": syntax error
и запрос выглядит как: "... where index=" попробуйте вставить туда какое-то значение имеющегося индекса, для проверки.
fAuto.SQLQ.ParamByName('I').AsInteger := strtoint(eIndex.Text);
