0

我正在更新一个在 Live 环境中工作和使用的当前程序,它保存客户和订单,然后将它们导出到旧数据库。所有的报表还在旧系统中完成,而新系统中的报表系统正在开发中,这就是为什么这些都需要导出的原因。

该程序有一个内置的 C# TransactionManager,用于在一个事务中将多个从 C# 到 SQL 的调用分组。每当我尝试复制它时,我都会出错并且无法正常工作。

这是到位的代码,工作:

using (ITransactionInfo trx = this.TransactionManager.BeginTransaction())
{
    //
    // Update the customer. If the customer doesn't exist, then create a new one.
    //
    this.SaveCustomer(Order);

    //
    // Save the Order.
    //
    this.Store.SaveCorporateOrder(Order, ServiceContext.UserId);

    //
    // Save the Order notes and the customer notes.
    //
    this.NotesService.AppendNotes(NoteObjectTypes.CorporateOrder, Order.Id, Order.OrderNotes);
    this.NotesService.AppendNotes(NoteObjectTypes.Customer, Order.Customer.Id, Order.CustomerNotes);

    //
    // Export the Order if it's new.
    //
    this.ExportOrder(Order, lastSavedVersion);

    //
    // Commit the transaction.
    //
    trx.Commit();
}

所有这些功能只是格式化数据并将参数发送到数据库中的存储过程,这些过程在数据库上执行选择/插入/更新操作。

SaveCustomer 存储过程将客户保存到新数据库中。

SaveCorporateOrder 存储过程获取由 Save Customer 存储过程编写的信息,并使用它来将 Order 保存到新数据库中。

ExportOrder 存储过程获取由前两个存储过程写入的信息,并将 Order 导出到旧数据库。

这些存储过程中的每一个都包含在@@TRANCOUNT == 0 时启动新事务的代码,并在末尾有一个提交语句。由于 C# 中的事务,似乎这些都没有被使用,但是没有代码可以将事务信息或连接信息传递给我可以看到的存储过程。这是在 SQL 2005 服务器上工作和使用的。

当我尝试构建它并在使用 SQL 2008R2 的开发环境中使用它时,我收到如下错误

"Uncommittable transaction is detected at the end of the batch"

"The server failed to resume the transaction"

似乎每个人都在开始自己的事务,并且无法从前一个未提交的事务中读取数据,而不是看到它在同一个事务中。我不知道不同的 SQL 版本是否会导致其工作方式不同,但完全相同的代码在 Live 安装中有效,但在我的开发环境中无效。

任何想法,甚至是下一步的方向都会很棒!

谢谢!-雅各布

4

1 回答 1

0

我认为问题是因为交易失败并且没有被拒绝。当任何 SQL 查询失败时,您没有回滚调用。你检查过这些查询吗?

于 2013-03-06T22:57:09.520 回答