- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 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/
在 MVC 项目中,我有一个带有命令和查询的服务层。 在其中一些命令和查询中,我使用了需要连接的 Dapper。 public class GetPostsStatsQuery { public
我应该如何将 IDbConnection 和 IDbTransaction 与 Dapper 一起使用? 目前我只使用 IDbConnection 。如下: using (SqlConnection
当我编写应用程序时,我使用 System.Data 接口(interface)(IDbConnection、IDbCommand、IDataReader、IDbDataParameter 等...)。
我想用 firebird db 测试 dapper micro orm,但我很难访问 firebird。 Firebird 服务器已启动并运行,数据库中填充了一些虚拟数据,并存储在 c:\mydata
我有时会引发此异常: System.InvalidOperationException: 'The ConnectionString property has not been initialized
我有一个使用 autofac 进行依赖注入(inject)的 .NET MVC 应用程序。当应用程序启动时,以下代码注册 IDbConnection var connectionString = C
当连接到 SQL-Server 时,我的程序执行挂起在 .Open() 方法上超过指定的 2 秒超时。 当数据库所在的机器离线或重新启动时,我设法重现了这个问题。当数据库所在的机器启动时,程序的执行将
我有一些按顺序调用的方法,它们都按顺序对 MySQL 数据库执行查询: UpdateInvoice() - > UpdateOrderItems(connection) |--------
我有一个 IDbConnection 的实例,它可以是任何连接、Sql、OleDb 等。我想制作一个通用包装器,这样我就可以向包装器发送一个连接并获得一组很好的方法以便于操作。我有一个 Query 方
虽然我的假设听起来很主观,但经过一些研究后,我发现开发人员喜欢使用虚拟 Try/Catch 而不是使用 Using statement 的情况并不少见。用于 IDbConnection/IDbTran
我知道将 IDbConnection 对象包装在 using block 中可确保调用 Dispose 并释放它正在使用的资源。话虽如此,我是否还需要将 IDbCommand 和 IDataReade
我在我的 ASP.NET WebForms 解决方案中使用了 dapper。 我所有处理数据的类都从这个基类中检索一个打开的连接 public abstract class SalesDb : IDi
我需要一些帮助 我尝试将 INSERT 插入到我的 SQL 数据库中,但我做不到,因为在此代码行中给我一个错误: commandoSQL.Connection = dbcon; 我收到这个错误: A
TLDR:注入(inject)连接工厂与 IDbConnection 本身的原因是什么。 我目前在 .net MVC 中使用 Autofac 将 IDbConnection 实例注入(inject)到
Entity Framework cotext DbContext 具有采用 DbConnection 的构造函数。为什么不是 IDbConnection? 是否通常将 DbConnection 传递
我有一个 .Net 核心 Web 应用程序和 .net 核心库。在使用 Dapper 时,我需要传入一个继承自 IDbConnection 的具体类。问题是在 .Net Core 中 System.D
我正在尝试使用Dapper.Contrib使用 .insert() 方法等扩展 IDbConnection 接口(interface)的功能。 为此,我遵循了一些简短且分散的文档 here和 here
注入(inject)连接字符串与 IDbConnection 实例的权衡是什么? ? 我使用 StructureMap 将各种服务注入(inject)到我的 ASP.NET MVC 应用程序中,其中大
我想知道关于在 .Net 应用程序中维护与数据库的连接的最佳做法是什么(ADO.NET,但我想这种做法对于任何数据层都应该是相同的)。我应该创建一个数据库连接并将其传播到我的整个应用程序,还是只传递连
在 Dapper 中使用 BeginTransaction() 和 IDbConnection 的正确方法是什么? 我创建了一个方法,我必须在其中使用 BeginTransaction()。这是代码。
我是一名优秀的程序员,十分优秀!