2

我正在尝试使用以下代码将字段添加到数据库中:

        adoquery1.Close;
        ADOQuery1.SQL.Clear;
        adoquery1.SQL.Text := 'INSERT INTO tbllogin (txusername, txpassword, link, full_name) VALUES ("' + e1 + '","' + e2 + '","' + cb2 + '","' + e4 + '");';
        adoquery1.Open;
        adoquery1.Close;

e1、e2、e4 和 cb2 是使用的变量。

这是一个查询示例:

这是一个例子

这是我得到的错误:

这是我得到的错误

Microsoft Jet 4.0 OLE DB 提供程序

我不知道如何解决这个错误,感谢任何帮助!

4

1 回答 1

9

SELECT是唯一应该与 一起使用的语句ADOQuery.Open,因为它通过选择行并返回它们来返回一个行集。

INSERT、 'UPDATE' 和 'DELETE' (以及CREATEDROPALTER)不返回行集,因此您应该使用ADOQuery.ExecSQL

    ADOQuery1.SQL.Clear;
    adoquery1.SQL.Text := 'INSERT INTO tbllogin (txusername, txpassword, link, full_name) VALUES ("' + e1 + '","' + e2 + '","' + cb2 + '","' + e4 + '");';
    adoquery1.ExecSQL;

另外,请在此处对SQL 注入进行一些研究,并停止连接您的 SQL。首先要学会正确地使用参数化语句。它不仅更安全,而且从 DBMS 中提供了更好的性能。写上面的正确方法INSERT是这样的:

    ADOQuery1.SQL.Clear;
    adoquery1.SQL.Add('INSERT INTO tbllogin');
    ADOQuery1.SQL.Add('(txusername, txpassword, link, full_name)');
    ADOQuery1.SQL.Add('VALUES (:txusername, :txpassword, :link, :full_name)');
    ADOQuery1.Parameters.ParamByName('txusername').Value := e1;
    ADOQuery1.Parameters.ParamByName('txpassword').Value := e2;
    ADOQuery1.Parameters.ParamByName('link').Value := cb2;
    ADOQuery1.Parameters.ParamByName('full_name').Value := e4;       
    ADOQuery1.ExecSQL;
于 2013-10-12T15:48:42.350 回答