我是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
请尽可能多地提供有关此错误发生原因的信息,正如我所说,我还在学习并提前感谢您:)
答案 0 :(得分:3)
如果你坚持使用字符串连接(尽管有相反的建议),至少要消除试图计算单引号的噪音并使用QuotedStr(再一次,链接是XE4文档,但是该函数也存在于Delphi 7中。
我在回答您的其他问题时提供的相同信息也适用于此处。 Name
仍是MS Access中的保留字,因此仍需要[]
包围。每次使用它都需要它,这也是我建议你在你走得太远之前改变字段名称的原因。
您发布的代码显示ADOQuery最终被释放,但未显示正在创建。我已经添加了这些代码以便它有意义;您需要将连接字符串替换为数据库中的连接字符串。我还从ADOQuery1
更改了ADOQuery的名称(这将与您的表单上任何现有的ADOQuery与默认名称冲突),因为您的代码似乎只是为这段代码创建了一个新代码。如果您实际上已经在表单或数据模块上使用了一个,则应删除try
,Create
,ConnectionString
和行finally
,Free
,以及下一个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;
然而,再次使用参数化查询会更好。它只增加了两行代码,消除了ExecSQL
行SQL 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
当您说消息正在显示时 - 哪条消息?有没有错误的详细信息?