小巧玲珑。 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 个命令?我应该使用BeginTransationEndTransaction 吗?

【问题讨论】:

您的问题到底是什么?你是什​​么意思,“你应该如何使用”它们? 目前我只使用一个 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)

注入连接字符串与 IDbConnection

休眠一个 isession 相同的 idbconnection

.Net 核心依赖注入 IdbConnection

共享 IDbConnection 以保持事务本地化