我有一些代码要执行,如下所示。但在第二次迭代时,我一直收到异常"This SqlTransaction has completed;it‘s no“。有人能帮我指出我在这里做错了什么吗?谢谢!
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();
}发布于 2010-08-25 03:39:00
在循环中,您可以提交或回滚,但不会重置对null的引用。SqlTransaction通常不会用在using()块中,就像SqlConnection一样:
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);
}
}发布于 2010-08-25 03:33:15
如果您希望循环内的所有操作都发生在单个事务中,则需要在每次迭代中创建一个新的SqlTransaction对象,或者将事务完全移出循环。提交事务后,有必要在连接上再次调用BeginTransaction以启动新的事务。您不能重用旧的事务对象。
发布于 2010-08-25 03:34:12
在清除sqlTransaction对象后,尝试将其设置为null。附注,您真的应该使用块来包装这些IDisposable对象,这样就可以随时调用Dispose。
sqlTransaction.Commit();
sqlTransaction.Dispose();
sqlTransaction = null;https://stackoverflow.com/questions/3560291
复制相似问题