ASP.Net で送信ルーチンを実行しています。問題は、try-catch ブロックでコードをデバッグしているときに、ユーザーがエラーに遭遇した場合、SQL トランザクションがロールバックしないことです。
このサブミット ルーチンを途中で中断すると、SQL Server 2008 が完全にハングします。SSMS からでも Select/Insert 操作を実行できません。最後に、トランザクションをロールバックするために SQL Server を再起動する必要があります。
提出用コード:
SqlConnection conn = Db.getConn();
if (conn.State == ConnectionState.Closed) conn.Open();
SqlTransaction trn;
trn = conn.BeginTransaction();
SqlCommand sqlCmd = new SqlCommand("", conn);
sqlCmd.Transaction = trn;
try
{
string query = GetQuery(); // works fine
sqlCmd.CommandText = query;
sqlCmd.ExecuteNonQuery();
using (SqlBulkCopy bcp = new SqlBulkCopy(conn,SqlBulkCopyOptions.Default, trn))
{
bcp.ColumnMappings.Add("FaYear", "FaYear");
bcp.ColumnMappings.Add("CostCode", "CostCode");
bcp.ColumnMappings.Add("TokenNo", "TokenNo");
bcp.DestinationTableName = "ProcessTokenAddress";
bcp.WriteToServer(globaltblAddress.DefaultView.ToTable());
}
trn.commit();
}
catch (SqlException ex)
{
trn.Rollback();
}
注:ここでコードを書いているときに、ExceptionではなくSqlExceptionをキャッチしたことに気付きました。それがエラーの原因ですか?ふー?
重要: Page_UnLoad または予期しない状況を処理できるその他のイベント ハンドラーでトランザクションをロールバックする必要がありますか (たとえば、トランザクションの進行中にユーザーがブラウザーを閉じる、ユーザーが [戻る] ボタンを押すなど)。