2012-03-23 14 views
3

DapperでIDbConnectionとIDbTransactionをどのように使うべきですか?Dapper。 IDbConnectionとIDbTransaction

現時点ではIDbConnectionのみを使用しています。次のようなものがあります:

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

時には2つのコマンドを送信する必要がありますか? BeginTransationEndTransactionを使用する必要がありますか?

+0

正確にあなたの質問は何ですか?あなたはどうしたらいいですか? –

+0

現時点ではIDbConnectionのみを使用しています。次のようなものがあります: 'using(SqlConnection connection = new SqlConnection(connectionString)){connection.Execute(@ "ロール名(名前)の値(@name)"、new {name = "Role"}); } '。しかし時々私は2つのコマンドを送る必要がありますか?私はBeginTransationとEndTransactionを使うべきですか? –

答えて

12

はい、2つの独立したコマンドがアトミックで失敗する必要がある場合は、トランザクションを使用する必要があります。

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メソッドにはトランザクションのオプションがあります。それはいつ使うべきですか?その場合、私はそれが1つのコマンドのためだけだと考えます... –

+0

@Shapper、その構文を使用した例を追加しました。 1つのステートメントだけを実行している場合は、おそらくそれを使用する必要はありません。しかし、複数のステートメントを含むSQLを実行している場合は、アトミック性が必要な場合に使用する必要があります。 –

+0

はい、私は今理解しています。しかし、Dapper Executeメソッドでは、トランザクションである1つの引数...これは3番目の引数です: 'int Execute(このIDbConnection cnn、文字列sql、動的param = null、IDbTransactionトランザクション= null、int?commandTimeout = null、CommandType ?commandType = null)。 'だからあなたが投稿したものと同じことをしますが、その1つのコマンドに対してのみ正しいのですか?なぜ、1つのコマンドだけを実行しているときにトランザクションを使用するのですか? –