小巧玲珑。 IDbConnection 和 IDbTransaction
Posted
技术标签:
【中文标题】小巧玲珑。 IDbConnection 和 IDbTransaction【英文标题】:Dapper. IDbConnection and IDbTransaction 【发布时间】:2012-04-08 11:49:46 【问题描述】:我应该如何将 IDbConnection 和 IDbTransaction 与 Dapper 一起使用?
目前我只使用IDbConnection
。内容如下:
using (SqlConnection connection = new SqlConnection(connectionString))
connection.Execute(@"insert Roles(Name) values (@name)", new name = "Role" );
但有时我需要发送 2 个命令?我应该使用BeginTransation
和EndTransaction
吗?
【问题讨论】:
您的问题到底是什么?你是什么意思,“你应该如何使用”它们? 目前我只使用一个 IDbConnection。如下所示:'using (SqlConnection connection = new SqlConnection(connectionString)) connection.Execute(@"insert Roles(Name) values (@name)", new name = "Role" ); '。但有时我需要发送 2 个命令?我应该使用 BeginTransation 和 EndTransaction 吗? 【参考方案1】:是的,如果您需要两个单独的命令是原子的并且一起失败,那么您应该使用事务。
using (new TransactionScope(TransactionScopeOption.Required))
connection.Execute(...);
connection.Execute(...);
或者如果你想使用BeginTransaction
并传入,你也可以这样做:
using (var transaction = connection.BeginTransaction())
connection.Execute(sql1, params1, transaction);
connection.Execute(sql2, params2, transaction);
【讨论】:
但是在执行方法中有一个交易选项。我应该什么时候使用它?在那种情况下,我想它只适用于一个命令...... @Shapper,我使用该语法添加了一个示例。如果您只执行一条语句,您可能不需要使用它。但是,如果您正在执行包含多个语句的 SQL,那么您应该在需要原子性时使用它。 是的,我现在明白了。但是在 Dapper Execute 方法中,您还有一个参数是事务......它是第三个参数:'int Execute(this IDbConnection cnn, string sql, dynamic param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType ? commandType = null)。因此,它与您发布的内容相同,但仅针对该一个命令,对吗?那么,当你只执行一个命令时,为什么要使用事务呢? @Shapper,当您想要传入事务对象时,有两种可能的情况。 1)你已经有一个现有的交易,你想在 dapper 调用中利用它。或者 2) 你有一个单独的 SQL 字符串来执行多个语句(用分号分隔),所有这些都希望在一个事务下发生。 现在我明白了。感谢您的帮助!以上是关于小巧玲珑。 IDbConnection 和 IDbTransaction的主要内容,如果未能解决你的问题,请参考以下文章
将 BeginTransaction 与 Dapper.IDbConnection 一起使用的正确方法
如何从 IDbConnection “继承” - 只需添加一个属性(DatabaseType)