0

我是 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

请提供尽可能多的信息来说明为什么会发生此错误,正如我所说的我还在学习并提前谢谢你:)

4

2 回答 2

3

如果您坚持使用字符串连接(尽管所有建议都相反),至少消除尝试计算单引号并使用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;
于 2013-09-05T13:03:04.333 回答
0

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

当您说正在显示消息时 - 哪个消息?有任何错误详情吗?

于 2013-09-05T11:59:36.920 回答