2

我正在开发一个使用 C# 和 SQL Server 作为数据库的 .NET Web 应用程序,这两种技术都是新手。当我尝试同时保存大量信息时遇到问题。

我的代码很简单:

  SqlConnection cn = null;
  try
  {
    using (TransactionScope scope = new TransactionScope())
    {
      using (cn = Util.getConnection())
      {
        cn.Open();

        BusinessObject.saveObject1(param1, cn);
        BusinessObject.saveObject2(param2, cn);
        BusinessObject.saveObject3(param3, cn);
        BusinessObject.saveObject4(param4, cn);

        ...

        scope.Complete();

      }
    }

我总是使用相同的连接对象,因为如果发生错误,我必须撤销对数据的任何更改,并且如果过程正常,则需要相同的行为。

我不介意保存过程需要很多时间,在我的应用程序中是完全正常的,因为我必须保存很多信息。

这里的奇怪之处在于:

  • 当我在数据库的同一局域网中执行此功能时,它可以完美运行。
  • 但是,如果我从外部执行它,例如通过 VPN 连接,因此延迟较高,我会收到一条错误消息:“与当前连接关联的事务已完成但尚未处理。事务必须是在连接之前配置好,可以用来执行 SQL 语句。”

我试图通过 web.config 中的连接字符串更改数据库的超时,但它没有解决任何问题。此外,如果在每个 executeNonQuery() 语句之后执行 cn.Dispose(),则在下次尝试使用连接对象时会出错。

我是否必须更改 TransactionScope 对象的参数?还有另一种更好的方法吗?

提前致谢。

4

3 回答 3

2

这是由于超时错误。在TransactionScope超时的情况下,可能会决定回滚事务。

您需要在TransactionScope构造函数中增加超时值。默认最大值。超时为 10 分钟。

于 2012-07-15T11:30:35.990 回答
1

移出街区(scope.Complete();MSDN文章)。connection

于 2012-07-15T11:33:10.643 回答
1

您是否尝试Timeout = 0在您的Util.getConnection()功能中设置?值 0 表示没有限制。这肯定会完成这项工作。通过设置Timeout = 0将完成每一个长时间的操作作业。

于 2012-07-15T12:04:56.200 回答