【问题标题】:Dapper. IDbConnection and IDbTransaction小巧玲珑。 IDbConnection 和 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 吗?

标签: dapper idbconnection


【解决方案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 字符串来执行多个语句(用分号分隔),所有这些都希望在一个事务下发生。
  • 现在我明白了。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2019-11-10
相关资源
最近更新 更多