2012-03-23 5 views
3

Как использовать IDbConnection и IDbTransaction с Dapper?Dapper. IDbConnection и IDbTransaction

На данный момент я использую только IDbConnection. Что-то следующее:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Execute(@"insert Roles(Name) values (@name)", new { name = "Role" }); 
} 

Но иногда мне нужно отправить 2 команды? Должен ли я использовать BeginTransation и EndTransaction?

+0

Что именно ваш вопрос? Что вы имеете в виду, «как их использовать»? –

+0

На данный момент я использую только IDbConnection. Что-то следующее: 'using (SqlConnection connection = new SqlConnection (connectionString)) {connection.Execute (@ "вставить значения Roles (Name) (@name)", new {name = "Role"}); }». Но иногда мне нужно отправить 2 команды? Должен ли я использовать BeginTransation и EndTransaction? –

ответ

12

Да, если вам нужны две отдельные команды, которые будут атомарными и сбой вместе, тогда вы должны использовать транзакцию.

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); 
} 
+0

Но в методе Execute есть опция для транзакции. Когда я должен его использовать? В этом случае я полагаю, что это только для одной команды ... –

+0

@Shapper, я добавил пример с использованием этого синтаксиса. Вероятно, вам не нужно использовать его, если вы выполняете только один оператор. Однако, если вы выполняете SQL, который содержит несколько операторов, тогда вы должны использовать его, если вам нужна атомарность. –

+0

да, что я понимаю сейчас. Но в методе Dapper Execute у вас также есть один аргумент, который является транзакцией ... Это третий аргумент: 'int Execute (это IDbConnection cnn, string sql, dynamic param = null, IDbTransaction transaction = null, int? CommandTimeout = null, CommandType ? commandType = null). ' Таким образом, он делает то же самое, что и вы, но только для этой команды, правильно? Итак, зачем использовать транзакцию, когда вы выполняете только одну команду? –

 Смежные вопросы

  • Нет связанных вопросов^_^