假設我有一個數據庫的方法,看起來像這樣:測試不使用事務的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