使用编辑框msaccess delphi 7从数据库中删除记录

时间:2013-09-05 09:09:41

标签: sql delphi

我是delphi(或任何编码)的新手,我过去一周一直在学习SQL,但我尝试用来查找和删除Msaccess数据库中的记录的代码不起作用。当我运行它时它不会给出任何错误,当我单击按钮时它只是没有做任何事情,它显示消息但它不会从表中删除记录。我一直在使用这段代码:

begin
ADOQuery1.SQL.Text := 'SELECT * FROM Admins WHERE Name = '''+Edtname.text+'''';
ADOQuery1.Open;
if ADOQuery1.IsEmpty then
ShowMessage('User not found')
else
begin
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'DELETE FROM Admins WHERE Name = '''+EdtName.Text+'''';
ADOQuery1.ExecSQL;
ShowMessage('Information was Deleted');
end;
ADOquery1.Free;
end;

有关数据库的信息:

Collumns     Type
========     ====
Name         Text
Surname      Text
Dateadded    Date/time
Password     Text
Adminnumber  Number

请尽可能多地提供有关此错误发生原因的信息,正如我所说,我还在学习并提前感谢您:)

2 个答案:

答案 0 :(得分:3)

如果你坚持使用字符串连接(尽管有相反的建议),至少要消除试图计算单引号的噪音并使用QuotedStr(再一次,链接是XE4文档,但是该函数也存在于Delphi 7中。

我在回答您的其他问题时提供的相同信息也适用于此处。 Name 是MS Access中的保留字,因此仍需要[]包围。每次使用它都需要它,这也是我建议你在你走得太远之前改变字段名称的原因。

您发布的代码显示ADOQuery最终被释放,但未显示正在创建。我已经添加了这些代码以便它有意义;您需要将连接字符串替换为数据库中的连接字符串。我还从ADOQuery1更改了ADOQuery的名称(这将与您的表单上任何现有的ADOQuery与默认名称冲突),因为您的代码似乎只是为这段代码创建了一个新代码。如果您实际上已经在表单或数据模块上使用了一个,则应删除tryCreateConnectionString和行finallyFree ,以及下一个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;

然而,再次使用参数化查询会更好。它只增加了两行代码,消除了ExecSQLSQL injection所涉及的安全风险:

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;

答案 1 :(得分:0)

您是否为ADOQuery设置了连接字符串? 您可以通过为ADOQuery1.ExecSQL分配一个整数来检查受查询影响的行数: http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/ADODB_TADOQuery_ExecSQL.html

当您说消息正在显示时 - 哪条消息?有没有错误的详细信息?