每次我尝试使用存储过程与数据库进行通信时,我都会得到“无法对已关闭的数据集执行此操作”

时间:2010-07-12 11:03:24

标签: delphi sql-server-2005 stored-procedures dataset

我正在开发一个带有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'参数的值时。 我的错误在哪里以及如何解决?

2 个答案:

答案 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;