Проблема заключается в том, что Name
(и, возможно, Password
) является зарезервированным словом в MS Access , Это плохой выбор для имени столбца, но если вы его должны использовать, вы должны избегать его, заключая его в квадратные скобки ([]
). У вас также отсутствует открывающая скобка ((
) после вашего оператора VALUES
и запятая после параметра :adminnumber
.
ADOquery1.SQL.Add('Insert into admins');
ADOquery1.SQL.Add('([Name] , [Surname], [Dateadded], [Adminnumber], [Password])');
ADOquery1.SQL.Add('Values (:Name, :Surname, :Dateadded, :adminnumber, :Password)');
ADOquery1.Parameters.ParamByName('Name').Value := edit11.Text;
ADOquery1.Parameters.ParamByName('Surname').Value := edit12.Text;
ADOquery1.Parameters.ParamByName('Dateadded').Value := edit13.Text;
ADOquery1.Parameters.ParamByName('Password').Value := edit14.Text;
ADOquery1.Parameters.ParamByName('Adminnumber').Value := edit15.Text;
ADOquery1.ExecSQL;
ADOquery1.SQL.Text := 'Select * from admins';
ADOquery1.Open;
(ошибка не может двигаться вокруг, как вы говорите, в комментариях к вашему вопросу. Единственная линия, которая может возможно вызвать проблемы является ADOQuery1.ExecSQL;
линии, так как это единственный, который выполняет INSERT
заявление невозможно.)
Здесь вы должны внести некоторые изменения, которые очень важны для удобства обслуживания вашего кода.
Во-первых, немедленно нарушите привычку использовать имена по умолчанию для элементов управления, особенно те, которые вам нужно получить из вашего кода позже. Вы меняете имя, изменяя свойство Name
для элемента управления в Инспекторе объектов.
В коде используется намного проще использовать NameEdit.Text
, чем использовать Edit1.Text
, особенно к тому времени, когда вы доберетесь до Edit14
. Было бы намного яснее, если бы Edit14
было названо PasswordEdit
, и вы будете счастливы, что через полгода вы изменили код.
Во-вторых, вам следует избегать использования преобразования по умолчанию из строки, которое происходит, когда вы используете ParamByName().Value
. Он отлично работает, когда вы назначаете столбец text
, но не очень хорошо, когда тип не является текстом (например, при использовании дат или цифр). В таких случаях перед выполнением задания необходимо преобразовать в соответствующий тип данных, чтобы вы были уверены, что все сделано правильно.
ADOQuery1.ParamByName('DateAdded').Value := StrToDate(DateEdit.Text);
ADOQuery1.ParamByName('AdminNumber').Value := StrToInt(AdminNum.Text);
Наконец, вы должны никогда, никогда не использование конкатенации, таких как 'НЕКОТОРЫХ SQL ''' + Edit1.Text + '' ' '''. Это может привести к серьезной проблеме безопасности под названием SQL injection, которая может позволить злоумышленнику удалить ваши данные, сбросить таблицы или сбросить идентификаторы и пароли пользователей и предоставить им бесплатный доступ к вашим данным.Поиск Google найдет массу информации об уязвимостях, которые он может создать. Вы не должны даже делать это в коде, который, по вашему мнению, безопасен, потому что в будущем все может измениться, или вы можете получить недовольного сотрудника, который решает вызвать проблемы на выходе.
В качестве примера, если пользователь решает поставить John';DROP TABLE Admins;
в edit14
в вашем приложении, и вы называете ExecSQL
с этим SQL, вы больше не будете иметь Admins
таблицу. Что произойдет, если вместо этого они вместо этого используют John';UPDATE Admins SET PASSWORD = NULL;
? Теперь у вас нет пароля для любого из ваших администраторов.
Какая ошибка? Каков точный текст запроса, который вызывает ошибку? Первая версия может дать множество различных синтаксических ошибок, учитывая, что она позволяет пользователю выполнять любой SQL, который они хотят. (Подсказка: он широко открыт для атак SQL-инъекций.) – David
Точная ошибка моего первого кода: «Project project1.exe повышен класс исключений eoleException с сообщением« Ошибка синтаксиса в инструкции INSERT INTO ». И вторая ошибка кода: «Project project1.exe повышает класс исключений eoleException с сообщением« ошибка в предложении FROM ».« – user2748631
Я ожидаю, что проблема с тройными апострофами может быть проблемой. Возможно, вы можете использовать Double Quotes в качестве ваших литеральных разделителей или вам нужно, чтобы Escape Single Quotes правильно. Sontheim Solution должен использовать эквивалент delphi функции chr, представляющий одиночную цитату 'chr (39)'. – collapsar