gpt4 book ai didi

c# - 将 BeginTransaction 与 Dapper.IDbConnection 一起使用的正确方法

转载 作者:IT王子 更新时间:2023-10-29 04:20:30 26 4
gpt4 key购买 nike

在 Dapper 中使用 BeginTransaction()IDbConnection 的正确方法是什么?

我创建了一个方法,我必须在其中使用 BeginTransaction()。这是代码。

using (IDbConnection cn = DBConnection)
{
var oTransaction = cn.BeginTransaction();

try
{
// SAVE BASIC CONSULT DETAIL
var oPara = new DynamicParameters();
oPara.Add("@PatientID", iPatientID, dbType: DbType.Int32);
..........blah......blah............
}
catch (Exception ex)
{
oTransaction.Rollback();
return new SaveResponse { Success = false, ResponseString = ex.Message };
}
}

当我执行上面的方法时 - 我得到了一个异常 -

Invalid operation. The connection is closed.

这是因为在连接打开之前您无法开始事务。所以当我添加这一行:cn.Open(); 时,错误得到解决。但我在某处读到,手动打开连接是不好的做法!! Dapper 仅在需要时打开连接。

在 Entity Framework 中,您可以使用 TransactionScope 处理事务。

所以我的问题是,在 Dapper 中不添加 cn.Open()... 行来处理交易的最佳做法是什么?我想应该有一些合适的方法。

最佳答案

手动打开连接并不是“坏习惯”; dapper 使用打开或关闭的连接只是为了方便,仅此而已。一个常见的陷阱是人们的连接处于打开状态、未使用状态,并且时间过长而没有将它们释放到池中 - 但是,在大多数情况下这不是问题,您当然可以这样做:

using(var cn = CreateConnection()) {
cn.Open();
using(var tran = cn.BeginTransaction()) {
try {
// multiple operations involving cn and tran here

tran.Commit();
} catch {
tran.Rollback();
throw;
}
}
}

注意dapper有一个可选的参数可以传入交易,例如:

cn.Execute(sql, args, transaction: tran);

实际上,我很想IDbTransaction 上创建类似工作的扩展方法,因为 a transaction always exposes .Connection ;这将允许:

tran.Execute(sql, args);

但这在今天不存在。

TransactionScope 是另一种选择,但具有不同的语义:这可能涉及 LTM 或 DTC,具体取决于……好吧,主要是运气。围绕 IDbTransaction 创建一个不需要 try/catch 的包装器也很诱人 - 更像是 TransactionScope作品;类似的东西(这也不存在):

using(var cn = CreateConnection())
using(var tran = cn.SimpleTransaction())
{
tran.Execute(...);
tran.Execute(...);

tran.Complete();
}

关于c# - 将 BeginTransaction 与 Dapper.IDbConnection 一起使用的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24650710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com