0

我需要从 Delphi 调用一些存储过程,因为它们是相关的,所以我必须使用事务。
但是它在调用时总是返回一个错误:

'事务不能有多个具有这种游标类型的记录集。更改游标类型、提交事务或关闭其中一个记录集。

而这个错误只发生在 MS SQL SERVER 2008 上,当我使用 MS Access 时它工作正常。
有什么问题 ?

提前致谢

更新 :

procedure TForm1.Button2Click(Sender: TObject);  
begin  
    if not DM.ADOConnection.InTransaction then  
        dm.ADOConnection.BeginTrans;  
    ADOQuery.LockType := ltBatchOptimistic;  
    ADOQuery.CursorType := ctUnspecified;  
    Try  
        with ADOQuery do  
        begin  
            Close;  
            SQL.Clear;  
            SQL.Text := 'INSERT INTO [UserAction] (UAct_Frm_ID,UAct_Type,UAct_Description'  
              +',UAct_Date,UAct_Time,UAct_Usr_ID)'
              +'VALUES(:UAct_Frm_ID'
              +',:UAct_Type,:UAct_Description,:UAct_Date,:UAct_Time'
              +',:UAct_Usr_ID)';
  Parameters.ParamByName('UAct_Frm_ID').Value := 1;
  Parameters.ParamByName('UAct_Type').Value := 1;
  Parameters.ParamByName('UAct_Description').Value := 'test by Q1';
  Parameters.ParamByName('UAct_Date').Value := completdate(datenow);
  Parameters.ParamByName('UAct_Time').Value := TimeToStr(Now);
  Parameters.ParamByName('UAct_Usr_ID').Value := 1;
  ExecSQL;
  end;
  Except
    DM.ADOConnection.RollbackTrans;
    ShowMessage('RollBack');
    Exit;
  End;
  dm.ADOConnection.CommitTrans;
  ShowMessage('Commite');
end; 
4

2 回答 2

1

这里

分辨率

使用不同的游标类型,将游标位置更改为 adUseClient 或关闭第一个记录集,然后再在同一连接/事务上打开另一个记录集。

原因

SQL Server 一次只能在一个连接上打开一个 ForwardOnly 游标,因为 SQL Server 每个连接一次只能处理一个活动语句。

当您尝试在单个 Connection 上一次打开多个 ForwardOnly ADO 记录集时,实际上只在 Connection 对象上打开第一个 ADO 记录集。为后续的 ForwardOnly 游标创建新的单独连接。

事务在单个连接上。当您尝试在单个事务中打开多个 ForwardOnly 记录集时,ADO 会尝试在该事务的连接上打开多个 ForwardOnly 记录集。发生错误是因为 SQL Server 在单个连接上只允许一个 ForwardOnly 记录集。由于错误是在手动事务中,您可能会看到上面的错误。Microsoft 数据访问对象 2.1 Service Pack 2 和更高版本的 MDAC 包含更多信息错误消息。出于这个原因,您可能会在上面看到更多信息性的第二或第三错误消息。

于 2010-08-30T11:20:46.550 回答
-1

尝试将[eoExecuteNoRecords]包含到ExecuteOptions中。

于 2010-09-02T23:42:38.707 回答