Delphi中的SQL错误:当前提供程序不支持从单个执行中返回多个记录

时间:2013-10-12 15:25:18

标签: sql delphi delphi-7

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

        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是使用的变量。

这是查询的一个示例:

This is an example

这是我得到的错误:

This is the error I get

Microsoft Jet 4.0 OLE DB提供程序

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

1 个答案:

答案 0 :(得分:9)

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

INSERT,'更新'和'删除'(以及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;