我正在开发一个带有MS SQL Server数据库的Delphi项目,我使用Borland Delphi 7中的ADOConnection,DataSource和ADOProc组件连接数据库,我在后面添加了这个代码:
procedure TForm1.Button2Click(Sender: TObject);
begin
ADOStoredProc1.ProcedureName := 'sp_Delete_Clen';
ADOStoredProc1.Refresh;
ADOStoredProc1.Parameters.ParamByName('@clenID').Value := Edit6.Text;
ADOStoredProc1.Active := True;
ADOStoredProc1.ExecProc;
end;
组件Edit6是一个编辑框,它获取应该从数据库中删除的元组的ID,ADOStoredProc1是数据库中的存储过程,它包含1个参数(您要删除的ID)。 项目运行没有问题,我甚至有一个TADOTable和一个从数据库加载信息的DBGrid,但是当我尝试使用EditBox中写的ID从数据库中删除一个元组时,我得到这个错误:“无法执行此操作关闭数据集的操作“和项目的断点是当应用程序尝试添加'clenID'参数的值时。 我的错误在哪里以及如何解决?
答案 0 :(得分:3)
我认为ADOStoredProc1.Refresh方法不合适。在这种情况下,存储过程不返回结果集。你能把它留下来吗?还行ADOStoredProc1.Active:= True。我认为与数据库的连接是开放的?您还可以在Object Inspector中检查Parameters集合的值吗?
答案 1 :(得分:2)
我想您要拨打ADOStoredProc1.Parameters.Refresh
,而不是ADOStoredProc1.Refresh
。
此外,如果SQL Server存储过程返回数据集(即SELECT语句的结果),则只应将Active设置为True。将Active设置为True与调用Open。相同。
如果存储过程只返回结果代码(RETURN n ),则使用ExecProc。
在任何情况下,您都不应同时使用ADOStoredProc1.Active := True;
和ADOStoredProc1.ExecProc;
总之,您可能需要类似
的内容procedure TForm1.btnDeleteClick(Sender: TObject);
begin
ADOStoredProc1.ProcedureName := 'sp_Delete_Clen';
ADOStoredProc1.Parameters.Refresh; // gets the parameter list from SQL Server
ADOStoredProc1.Parameters.ParamByName('@clenID').Value := edtID.Text;
ADOStoredProc1.ExecProc;
end;