【问题标题】:Problem with using transaction in delphi when calling to MS SQL SERVER 2008 R2?调用 MS SQL SERVER 2008 R2 时在 delphi 中使用事务有问题吗?
【发布时间】:2011-04-05 17:11:55
【问题描述】:

我需要从 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; 

【问题讨论】:

  • 你能发布违规代码吗?

标签: delphi transactions delphi-2010 ado sql-server-2008-r2


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    来自here

    分辨率

    使用不同的游标类型,改变 adUseClient 的光标位置或 关闭第一个记录集之前 在同一个地方打开另一个 连接/交易。

    原因

    SQL Server 只能打开一个 ForwardOnly 光标一次在 连接,因为 SQL Server 可以 只处理一个活动语句 每次连接的时间。

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

    一个交易是在一个单一的 联系。当您尝试打开 多个 ForwardOnly 记录集 在单个事务中,ADO 尝试打开多个 ForwardOnly 记录集上的 交易的关联。一个 发生错误是因为只有 SQL Server 允许一个 ForwardOnly 记录集 单连接。因为错误 在手动交易中,您 可能会看到上面的错误。微软 数据访问对象 2.1 Service Pack 2 和更高版本的 MDAC 包含 更多信息的错误消息。为了 这个原因,你可能会看到更多 信息丰富的第二个或第三个错误 消息,上面。

    【讨论】:

    • 我使用了所有的光标类型,但没有一个起作用:未指定、OpenForwardOnly、键集、动态、静态
    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多