delphi - 我的插入语句中出现语法错误

标签 delphi ms-access delphi-7 ado

我正在使用MS Access数据库,在Admins表中包含以下列:

Column        Type
======        ====
Name          Text 
Surname       Text 
Dateadded     Date/time 
Adminnumber   Number(long integer) 
Password      Text 
ID type       Autonumber  (Not sure if ID is relevant) 


这是我的代码,但始终给我语法错误。

ADOquery1.Active := false;
adoquery1.sql.Text := 'insert into Admins(Name, surname, Adminnumber, Dateadded,password)Values('''+edit11.Text+''', '''+edit12.text+''', '''+edit13.Text+''', '''+edit14.Text+''', '''+edit15.text+''')';
ADOquery1.ExecSQL;
Adoquery1.SQL.Text := 'select * from Admins';
ADOquery1.Active := true;


我已经尝试了一天,但无论使用什么代码,它都存在相同的错误。错误是


项目project1.exe引发异常类eoleException
消息“ INSERT INTO语句中的语法错误”。


我也尝试过:

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 ;


但是这段代码给我一个from子句的问题

最佳答案

问题是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);


最后,永远不要使用字符串连接,例如'SOME SQL'''+ Edit1.Text +''','''。这可能会导致严重的安全问题,称为SQL injection,它可能允许恶意用户删除您的数据,删除表或重置用户ID和密码,并赋予他们自由访问数据的权限。 Google搜索将找到有关其可能创建的漏洞的大量信息。您甚至不应该在您认为安全的代码中执行此操作,因为将来情况可能会发生变化,或者您可能会遇到一个心怀不满的员工,决定在出路时引起问题。

例如,如果用户决定将John';DROP TABLE Admins;放入应用程序的edit14中,并且使用该SQL调用ExecSQL,则将不再有Admins表。如果他们改用John';UPDATE Admins SET PASSWORD = NULL;怎么办?现在,您没有任何管理员用户的密码。

关于delphi - 我的插入语句中出现语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18624632/

相关文章:

listview - 如何更改 TListGroups 中的组顺序?

mysql - MS Access 查询计算字段

delphi - 如何同步父/子进程执行?

mysql - 通过 SSH 连接 (PuTTY) 通过 MS Access 操作 MySQL 数据库

delphi - 如何将 PDF 转换为 BMP/PNG/JPG 等

delphi - TPanel颜色为黑色,无论如何

mysql - 概率。使用 tquery.requeSTLive

delphi - 如何获取所有纸张尺寸名称和对应的像素尺寸?

delphi 2006 - 是否可以找出资源名称是否存在?

java - 使用 vector 从数据库填充 JTable 并在最后一列中显示复选框