2012-03-23 86 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個命令?我應該使用BeginTransationEndTransaction

+0

究竟什麼是你的問題?你是什​​麼意思,「你應該怎麼使用」他們? – 2012-03-23 22:35:27

+0

目前我只使用IDbConnection。 (SqlConnection connection = new SqlConnection(connectionString)){connection.Execute(@「insert Roles(Name)values(@name)」,new {name =「Role」}); }」。但有時我需要發送2個命令?我應該使用BeginTransation和EndTransaction嗎? – 2012-03-23 22:49:31

回答

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方法中有一個交易選項。我應該什麼時候使用它?在這種情況下,我想這只是一個命令... – 2012-03-23 23:04:46

+0

@Shapper,我添加了一個使用該語法的示例。如果您只執行一條語句,則可能不需要使用它。但是,如果您正在執行包含多個語句的SQL,那麼如果您需要原子性,則應該使用它。 – 2012-03-23 23:08:50

+0

是的,我現在明白了。但是在Dapper Execute方法中,你也有一個參數,它是一個事務...它是第三個參數:'int Execute(this IDbConnection cnn,string sql,dynamic param = null,IDbTransaction transaction = null,int?commandTimeout = null,CommandType ?commandType = null)。'所以它和你發佈的內容一樣,但只針對那一個命令,對嗎?那麼當你只執行一個命令時,爲什麼要使用一個事務呢? – 2012-03-23 23:16:47