C# SQL事务中的ExecuteOnQueryAsync和commit
我正在寻找我创建的一段代码的帮助,我正在尝试在事务中从c#进行异步SQL调用,例如,我可能正在更新或删除表中的行 这是我到目前为止所拥有的,但我似乎找不到在事务中执行此操作的更多信息,从我这里所拥有的以及我到目前为止所了解的情况来看,如果命令耗时,我相信它可能会尝试在命令完全完成之前提交事务。如果你能给我举个例子,我将不胜感激C# SQL事务中的ExecuteOnQueryAsync和commit,c#,ado.net,C#,Ado.net,我正在寻找我创建的一段代码的帮助,我正在尝试在事务中从c#进行异步SQL调用,例如,我可能正在更新或删除表中的行 这是我到目前为止所拥有的,但我似乎找不到在事务中执行此操作的更多信息,从我这里所拥有的以及我到目前为止所了解的情况来看,如果命令耗时,我相信它可能会尝试在命令完全完成之前提交事务。如果你能给我举个例子,我将不胜感激 var sqlQuery = "delete from table"; using (var connection = new SqlConnection
var sqlQuery = "delete from table";
using (var connection = new SqlConnection(ConnectionString))
{
await connection.OpenAsync();
using (var tran = connection.BeginTransaction())
{
using (var command = new SqlCommand(sqlQuery, connection, tran))
{
await command.ExecuteNonQueryAsync();
tran.Commit();
}
}
}
谢谢,您的代码看起来不错。我刚刚在命令的执行中添加了一个try/catch,以便在事务失败时回滚。因为您在
await命令行中使用了await
关键字代码>执行将一直阻止,直到方法返回为止,不管它需要多长时间(除非您从命令本身获得超时异常,在这种情况下,您应该将命令的执行超时设置得更高,或者找出它需要多长时间的原因)
@Igor感谢您的帮助,该方法实际上是从另一个类调用的,该类被包装在一个try-catch中-很抱歉我在我的帖子中提到了这一点。非常好。您仍然需要对已创建的SqlTransaction
的引用,尽管这样您就可以在代码中执行tran.RollBack()
(请参见下面的答案),但让调用代码这样做毫无意义,除非这是来自更大数据库抽象包装器的小样本或其他内容。@Igor Good shout,感谢您的回答在tran.Commit()中可以获得由于命令超时而导致的异常
var sqlQuery = "delete from table";
using (var connection = new SqlConnection(ConnectionString))
{
await connection.OpenAsync();
using (var tran = connection.BeginTransaction())
using (var command = new SqlCommand(sqlQuery, connection, tran))
{
try {
await command.ExecuteNonQueryAsync();
} catch {
tran.Rollback();
throw;
}
tran.Commit();
}
}