我不會依賴表約束進行數據驗證。在插入之前用查詢驗證數據。例外是要創建的昂貴對象。另外,我更喜歡有限制來防止無效數據,但不能驗證。我想到一個約束作爲桌子的安全帶。只有在發生錯誤時才應該調用它。業務邏輯應在插入前驗證所有數據。如果您的目標數據庫不支持它們,請不要依賴存儲過程。
這是我處理它的一般方法。
private void Form1_Load(object sender, EventArgs e)
{
OleDbConnection conn = null;
OleDbTransaction t = null;
try
{
conn = new OleDbConnection("a database");
conn.Open();
//query both tables to prevent insert fail,
//obviously UserID should be parameter.
var cmd = new OleDbCommand("select count(*) from User where UserID = 1", conn);
var count = (double)cmd.ExecuteScalar();
cmd.CommandText = "select count(*) from Email where UserID = 1";
count += (double)cmd.ExecuteScalar();
if (count != 0)
{
MessageBox.Show("Record exists");
return;
}
t = conn.BeginTransaction();
//insert logic goes here
t.Commit();
}
catch (Exception x)
{
//we still need catch block, someone else may have updated the
//data after you checked but before you insert or db open may
//fail
MessageBox.Show(x.Message);
if (t != null)
t.Rollback();
}
finally
{
if (conn != null)
conn.Close();
}
}
這種情況可能是故障需要傳遞給服務類進行日誌記錄的原因(不是我的情況,只是一個例子) – 2009-10-01 18:25:11