私はこのようになり、データベースの方法があるとします。トランザクションを使用しないSQLメソッドのテスト?
public void insertRow(SqlConnection c)
{
using (var cmd = new SqlCommand("insert into myTable values(@dt)",c))
{
cmd.Parameters.Add(new SqlParameter("@dt",DbType.DateTime)).Value = DateTime.Now;
cmd.ExecuteNonQuery();
}
}
は、今私は、このメソッドをテストするとします。私は挿入の結果をテストした後の変更をロールバックできるように、だから、私は、トランザクション内でこのメソッドをラップしようとしたテストケースを書く:
public void testInsertRow()
{
SqlConnection c = new SqlConnection("connection.string.here");
SqlTransaction trans = c.BeginTransaction();
insertRow();
// do something here to evaluate what happened, e.g. query the DB
trans.Rollback();
}
しかしこれは動作しない、ので:
ExecuteNonQueryでは、コマンドに割り当てられた接続が保留中のローカルトランザクション内にある場合、コマンドにトランザクションが必要です。コマンドのTransactionプロパティが初期化されていません。
トランザクションを受け入れるために、すべて単一のデータベースメソッドを書き換え、その後、トランザクションのための方法にnull
を渡すためにすべての単一の呼び出しを書き換えることなく、これを達成する方法はありますか?
例えば、これは動作します:
public void insertRow(SqlConnection c, SqlTransaction t)
{
using (var cmd = new SqlCommand("insert into myTable values(@dt)",c))
{
if (t != null) cmd.Transaction = t;
cmd.Parameters.Add(new SqlParameter("@dt",DbType.DateTime)).Value = DateTime.Now;
cmd.ExecuteNonQuery();
}
c.Close();
}
しかし、その後、私はそれぞれ、すべてのデータベースメソッドの呼び出しそのnull
パラメータを含めることを書き換え、またはそれぞれ、すべてのデータベースメソッドのオーバーライドの署名を書くことのどちらか持っています自動的にnull
に入ります。
public void insertRow(SqlConnection c) { insertRow(c, null); }
データベース呼び出しのトランザクションベースのテストを許可するにはどうすればよいですか?
[のTransactionScope](https://msdn.microsoft.com/en-us/library/ee818746(V = vs.110).aspxの) –
は、あなたがロールバックする前に、あなたの接続を閉じているように私には思えます。 – Lunyx
@ Lunyxあなたは正しいです、そこにいるはずはありませんでした。もちろんそれを削除しても問題は解決しませんが、指摘してくれてありがとうございます。 – fdmillion