我使用了参数方法,但现在我遇到了问题。我想在表格中插入我的所有数据。我需要一次插入2个表。继承了我的全部编码。需要帮忙。为什么会这样说?
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.SQL.Add('INSERT INTO subjek2 (CARD_ID, MATRIC_ID,NAMA,SUBJEK) VALUES');
ADOQuery1.SQL.Add('(card,matric,nama,subjek)');
ADOQuery1.Parameters.ParamByName('card').Value:= card1.Text;
ADOQuery1.Parameters.ParamByName('nama').Value:= Edit1.Text;
ADOQuery1.Parameters.ParamByName('matric').Value:= Edit2.Text;
ADOQuery1.Parameters.ParamByName('kursus').Value:= Edit3.Text;
ADOQuery1.Parameters.ParamByName('fakulti').Value:= Edit4.Text;
ADOQuery1.Parameters.ParamByName('seksyen').Value:= ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('tahun').Value:= Edit5.Text;
ADOQuery1.Open();
答案 0 :(得分:4)
您没有正确提供参数(正如我在之前的回答中所示)。请注意每个参数名称前面的冒号(:
):
ADOQuery1.SQL.Add('(:card, :matric, :nama, :subjek)');
还要注意(来自同一个上一个答案)你在为参数赋值时不使用冒号:
ADOQuery1.Parameters.ParamByName('card').Value := card1.Text;
再一次,在SQL中使用空格 !!你可以通过不在逗号分隔的东西之间放置空格来节省一次击键,并且在没有它们的情况下使其很多更难以阅读和维护。阅读(:card, :matric, :nama, :subjek)
比阅读(:card,:matric,:nama,:subjek)
要容易得多。现在开始学习如何正确地做事,并在以后保护自己(以及其他人)的头痛。
答案 1 :(得分:4)
您的代码中存在一些问题。
如果要执行多个语句,则必须使用语句分隔符(大多数时候;
)。你在陈述中错过了。
INSERT INTO STUDENT (CARD_ID,NAMA,MATRIC_ID,SUBJEK,KURSUS,FAKULTI,Seksyen,TAHUN) VALUES
(card,nama,matric,subjek,kursus,fakulti,seksyen,tahun); -- missed ;
INSERT INTO subjek2 (CARD_ID, MATRIC_ID,NAMA,SUBJEK) VALUES
(card,matric,nama,subjek); -- optional on last statement
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);
BTW:您没有向代码中的参数subjek
提供任何数据。
某些语句会将光标返回到数据(SELECT
),而其他语句则不会返回(INSERT
,DELETE
,...)。
如果您正在执行一个没有返回游标的语句,那么您不能使用Open
。相反,你必须ExecSQL
。
TADOQuery
您无法使用TADOQuery
和Access执行多个语句。你必须单独执行这些陈述。
如果您想要实现,所有数据都已写入,或者如果发生任何错误而没有写入数据,那么您必须在语句之前启动事务并且提交> strong>或回滚。
根据所有建议,您将获得以下代码(无交易)
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('nama').Value:= Edit1.Text;
ADOQuery1.Parameters.ParamByName('matric').Value:= Edit2.Text;
ADOQuery1.Parameters.ParamByName('subjek').Value:= '????'; // I don't know what
ADOQuery1.Parameters.ParamByName('kursus').Value:= Edit3.Text;
ADOQuery1.Parameters.ParamByName('fakulti').Value:= Edit4.Text;
ADOQuery1.Parameters.ParamByName('seksyen').Value:= ComboBox1.Text;
ADOQuery1.Parameters.ParamByName('tahun').Value:= Edit5.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.Parameters.ParamByName('card').Value:= card1.Text;
ADOQuery1.Parameters.ParamByName('nama').Value:= Edit1.Text;
ADOQuery1.Parameters.ParamByName('matric').Value:= Edit2.Text;
ADOQuery1.Parameters.ParamByName('subjek').Value:= '????'; // I don't know what
ADOQuery1.ExecSQL;