Вопрос, поднятый пользователем, заключается в том, что при попытке выполнить вставку данных в две таблицы одновременно с использованием компонента ADOQuery в Delphi возникает ошибка, связанная с отсутствием параметра card. Прежде чем перейти к решению проблемы, стоит отметить, что использование параметризованных запросов является хорошей практикой, так как это повышает безопасность и удобство обслуживания кода.
SQL-Statement
Сначала рассмотрим SQL-запросы. Если вы хотите выполнить более одного SQL-запроса, вам необходимо использовать разделитель запросов (обычно это точка с запятой ;). В вашем коде вы пропустили этот разделитель в запросах.
INSERT INTO STUDENT (CARD_ID,NAMA,MATRIC_ID,SUBJEK,KURSUS,FAKULTI,Seksyen,TAHUN) VALUES
(card,nama,matric,subjek,kursus,fakulti,seksyen,tahun); -- пропущен ;
INSERT INTO subjek2 (CARD_ID, MATRIC_ID,NAMA,SUBJEK) VALUES
(card,matric,nama,subjek); -- опционально на последнем запросе точка с запятой не требуется
Parameters
Параметры в SQL-запросах должны начинаться с двоеточия :, иначе они будут обрабатываться как обычные поля.
INSERT INTO STUDENT (CARD_ID,NAMA,MATRIC_ID,SUBJEK,KURSUS,FAKULTI,Seksyen,TAHUN) VALUES
(:card,:nama,:matric,:subjek,:kursus,:fakulti,:seksyen,:tahun);
INSERT INTO subjek2 (CARD_ID, MATRIC_ID,NAMA,SUBJEK) VALUES
(:card,:matric,:nama,:subjek);
Кстати, в вашем коде не было предоставлено данных для параметра subjek.
Выполнение запроса
Некоторые запросы возвращают курсор с данными (например, SELECT), в то время как другие (например, INSERT, DELETE, ...) не возвращают курсор. Если вы выполняете запрос, который не возвращает курсор, вам не следует использовать метод Open. Вместо этого необходимо использовать ExecSQL.
Множественные запросы / Access / TADOQuery
Вы не можете выполнить несколько запросов, используя TADOQuery и Access, вам нужно выполнить запросы отдельно. Если вы хотите убедиться, что все данные записаны, или если при ошибке ни одно из данных не записывается, вам нужно начать транзакцию перед выполнением запросов и затем вы можете подтвердить транзакцию или откатить её.
Следуя этим советам, вы придете к следующему коду (без транзакции):
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO STUDENT (CARD_ID,NAMA,MATRIC_ID,SUBJEK,KURSUS,FAKULTI,Seksyen,TAHUN) VALUES ');
ADOQuery1.SQL.Add('(:card,:nama,:matric,:subjek,:kursus,:fakulti,:seksyen,:tahun);');
ADOQuery1.Parameters.ParamByName('card').Value := card1.Text;
ADOQuery1.Parameters.ParamByName('subjek').Value := 'Значение для параметра subjek'; // Замените на актуальное значение
ADOQuery1.Parameters.ParamByName('nama').Value := Edit1.Text;
// ... остальные параметры ...
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO subjek2 (CARD_ID, MATRIC_ID,NAMA,SUBJEK) VALUES ');
ADOQuery1.SQL.Add('(:card,:matric,:nama,:subjek);');
// ... установка параметров ...
ADOQuery1.ExecSQL;
Обратите внимание, что в приведенном выше коде мы добавили точку с запятой после каждого SQL-запроса (кроме последнего), что является необходимым для выполнения нескольких запросов в одной строке SQL. Также мы заменили использование метода Open на ExecSQL, так как вставка данных не возвращает курсор с данными. Параметры в запросах начали с двоеточия, и мы установили значения параметров, используя соответствующие имена элементов интерфейса пользователя.
Вопрос связан с исправлением ошибок при работе с компонентом ADOQuery в Delphi, в частности, при настройке параметров и синтаксисе SQL-запросов для одновременной вставки данных в две таблицы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.