如果您坚持使用字符串连接(尽管所有建议都相反),至少消除尝试计算单引号并使用QuotedStr的噪音(再次,链接是 XE4 文档,但该函数在 Delphi 7 中存在为出色地)。
我在回答您的其他问题时提供的相同信息也适用于此处。Name
仍然是 MS Access 中的保留字,因此仍需要用 .包围[]
。每次使用它时都需要它,这也是为什么我建议您在走得太远之前更改字段名称的原因。
您发布的代码显示 ADOQuery 在最后被释放,但没有显示它正在创建。我添加了该代码以使其有意义;您需要将连接字符串替换为数据库的连接字符串。我还更改了 ADOQuery 的名称ADOQuery1
(这将与表单上具有默认名称的任何现有 ADOQuery 冲突),因为您的代码似乎正在为这段代码创建一个新名称。如果实际上您已经在表单或数据模块上使用了一个,您应该删除try
, Create
,ConnectionString
和 lines finally
,Free
和 next end
,并将所有TempQuery
变量重命名回ADOQuery1
.
var
NumRows: Integer;
TempQuery: TADOQuery;
begin
TempQry := TADOQuery.Create(nil);
try
TempQuery.ConnectionString := 'Use your own connection string here';
TempQuery.SQL.Text := 'SELECT * FROM Admins WHERE [Name] = ' +
QuotedStr(Edtname.text);
TempQuery.Open;
if TempQuery.IsEmpty then
begin
ShowMessage('User ' + EdtName.Text + ' not found!');
Exit;
end;
TempQuery.Close;
TempQuery.SQL.Text := 'DELETE FROM Admins WHERE [Name] = ' +
QuotedStr(EdtName.Text);
TempQuery.ExecSQL;
NumRows := TempQuery.RowsAffected;
ShowMessage(IntToStr(NumRows) + ' were deleted');
finally
TempQuery.Free;
end;
end;
然而,再一次,使用参数化查询会更好。它只增加了两行额外的代码,并在该行消除了SQL 注入ExecSQL
所涉及的安全风险:
TempQuery.SQL.Text := 'SELECT * FROM Admins WHERE [Name] = :UserName';
TempQuery.Parameters.ParamByName('UserName').Value := EdtName.Text;
TempQuery.Open;
TempQuery.SQL.Text := 'DELETE FROM Admins WHERE [Name] = :UserName';
TempQuery.Parameters.ParamByName('UserName').Value := EdtName.Text;
TempQuery.ExecSQL;