【发布时间】:2016-04-28 12:17:34
【问题描述】:
我有 2 个查询必须一起工作。第一个是 Update,第二个是 Insert 查询。我将它们放入 TransactionScope 范围:
using (TransactionScope scope = new TransactionScope())
{
SqlCommand updateCmd = new SqlCommand("UPDATE V_Stock SET Quantity= 5 WHERE Id=" + shelfId, con);
SqlCommand insertCmd = new SqlCommand("INSERT INTO V_Stock (Code, Quantity, Name) VALUES (@1, @2, @3)", con);
insertCmd.Parameters.AddWithValue("@1", "Code1");
insertCmd.Parameters.AddWithValue("@2", 15);
insertCmd.Parameters.AddWithValue("@3", "Name1");
try
{
updateCmd.ExecuteNonQuery();
insertCmd.ExecuteNonQuery();
}
catch (Exception ex)
{
scope.Complete();
string s = ex.ToString();
}
}
更新查询可以正常工作,但插入查询不能。在这种情况下,我不想执行它们。只有当它们正常工作时才应该执行它们。
我可以做些什么来一起处理这些查询?
【问题讨论】:
-
删除
scope.Dispose()行, using() 将为您完成此操作。还有为什么你在 catch 中需要 s 变量?也许缺少日志记录? -
调用
scope.Dispose()是不必要的,using已经这样做了。但是,您确实需要在查询完成后显式调用scope.Complete(),否则范围将回滚。此外,不清楚“不回滚”和“一起工作”是什么意思。您想要实现什么目标以及实际发生了什么? -
另外,调用
ExecuteNonQuery后,需要调用scope.Complete()提交事务。 -
在 ExecuteNonQuery() 之后使用 scope.Complete() 也不起作用
标签: c# sql asp.net transactionscope