我需要在数据库应用程序中添加sql语句的事务,到目前为止,我不需要这样做,因为我主要是提取数据,或者对现有数据进行非常小的更改。
我使用嵌套的using语句已经非常成功地使用了一个整洁的构造,但我想检查那些比我更了解的人,如果这个修改后的构造能够像我预期的那样嵌入事务。
using (SqlCommand cmd = new SqlCommand())
using (cmd.Connection = new SqlConnection()) {
cmd.Connection.ConnectionString = "...";
cmd.Connection.Open();
using (SqlTransaction tran = cmd.Connection.BeginTransaction()) {
// do the work (try catch wraps the statements)
// commit transaction if no errors found or rollback
}
cmd.Connection.Close();
}
提前谢谢你 问候 马丁
答案 0 :(得分:1)
内置的课程TransactionScope
更易于使用。在using
块中实例化它,其中的任何内容都将成为同一事务的一部分。
using(var ts = new TransactionScope())
using (SqlCommand cmd = new SqlCommand())
using (cmd.Connection = new SqlConnection())
{
cmd.Connection.ConnectionString = "...";
cmd.Connection.Open();
// Do the work
ts.Complete();
cmd.Connection.Close();
}
如果发生任何异常,则transactioncope将在处置时自动中止所有操作。 transactioncope还会影响在任何被调用函数中完成的任何操作,而不需要传递数据库连接。
答案 1 :(得分:1)
当你编写它时,它将无法工作 - 你必须通过SqlCommand类的Transaction property将命令与事务相关联。此外,您可能必须先打开连接才能启动事务
使用TransactionScope更容易,但要求数据库服务器设置为使用MSDTC
我们使用我工作的共享环境,而MSDTC不是一个选项。
答案 2 :(得分:0)
而不是SqlTransaction
,请考虑使用TransactionScope
。
使用TransactionScope
,您需要围绕using
创建包装SqlConnection
语句。要提交,您需要在块结束前调用Complete
。
using (var tx = new TransactionScope())
using (SqlCommand cmd = new SqlCommand())
using (cmd.Connection = new SqlConnection())
{
cmd.Connection.ConnectionString = "...";
cmd.Connection.Open();
// do the work (try catch wraps the statements)
// commit transaction if no errors found or rollback
tx.Complete(); // commits transaction
}