首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单个sqlconnection中的多个sqltransaction

单个sqlconnection中的多个sqltransaction
EN

Stack Overflow用户
提问于 2010-08-25 03:30:15
回答 3查看 8.2K关注 0票数 2

我有一些代码要执行,如下所示。但在第二次迭代时,我一直收到异常"This SqlTransaction has completed;it‘s no“。有人能帮我指出我在这里做错了什么吗?谢谢!

代码语言:javascript
复制
    SqlConnection cn = (SqlConnection)SqlConnectionManager.Instance.GetUserConnection(user);
 cn.Open();
 try
 {
    foreach (Master mRecord in masterList)
  {
   if (sqlTransaction == null)
       sqlTransaction = cn.BeginTransaction();
   SqlCommand cm = cn.CreateCommand();
   cm.Transaction = sqlTransaction;
   cm.CommandType = CommandType.StoredProcedure;
   cm.CommandText = "pr_InsertRecords";
       try
   {
    cm.ExecuteNonQuery();
    Debug.WriteLine("Auditor.Write: end sql table value param");
    sqlTransaction.Commit();
    sqlTransaction.Dispose();
   }
   catch (Exception Ex)
   {
    Debug.WriteLine(" Exception message: " + Ex.Message);
    if (Ex.InnerException != null)
    {
     Debug.WriteLine("Inner exception message" + Ex.InnerException.Message);
    }
    sqlTransaction.Rollback();
   }
  }
 }
 finally
 {
        cn.Close();
      }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-25 03:39:00

在循环中,您可以提交或回滚,但不会重置对null的引用。SqlTransaction通常不会用在using()块中,就像SqlConnection一样:

代码语言:javascript
复制
using (SqlConnection cn = SqlConnectionManager.Instance.GetUserConnection(user)) 
{
  foreach (Master mRecord in masterList)
  {
  try
  {
    using (SqlTransaction sqlTransaction = cn.BeginTransaction()) 
    {
      using (SqlCommand cm = cn.CreateCommand()) 
      {
        cm.Transaction = sqlTransaction;
        cm.CommandType = CommandType.StoredProcedure;
        cm.CommandText = "pr_InsertRecords";
        cm.ExecuteNonQuery();
      }
      sqlTransaction.Commit();
      Debug.WriteLine("Auditor.Write: end sql table value param");
    }
  }
  catch (Exception Ex)
  {
    Debug.WriteLine(" Exception message: " + Ex.Message);
  }
}
票数 5
EN

Stack Overflow用户

发布于 2010-08-25 03:33:15

如果您希望循环内的所有操作都发生在单个事务中,则需要在每次迭代中创建一个新的SqlTransaction对象,或者将事务完全移出循环。提交事务后,有必要在连接上再次调用BeginTransaction以启动新的事务。您不能重用旧的事务对象。

票数 2
EN

Stack Overflow用户

发布于 2010-08-25 03:34:12

在清除sqlTransaction对象后,尝试将其设置为null。附注,您真的应该使用块来包装这些IDisposable对象,这样就可以随时调用Dispose

代码语言:javascript
复制
sqlTransaction.Commit();
sqlTransaction.Dispose();
sqlTransaction = null;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3560291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档