Cách tốt nhất để sử dụng BeginTransaction bằng cách sử dụng try catch
Cho đến bây giờ tôi đang sử dụng hai khối thử bắt cho các truy vấn của mình. Cái đầu tiên sẽ báo lỗi nếu kết nối không được thiết lập. Cái thứ hai kiểm tra xem SqlCommand
có được thực thi thành công hay không. Như ví dụ bên dưới
try
{
using(varconnection=newSqlConnection())
using(varcmd=newSqlCommand())
{
connection.Open();
var transaction=connection.BeginTransaction();
cmd.Connection=connection;
cmd.Transaction=transaction;
try
{
cmd.CommandText="InsertintoCustomers(Name)values('Dimitri')";
cmd.ExecuteNonQuery();
cmd.CommandText="InsertintoCustomers(Name)values('George')";
cmd.ExecuteNonQuery();
transaction.Commit();
}
catch
{
try{transaction.Rollback();}catch{}
}
}
}
catch
{
}
Tôi đã tìm thấy một Ví dụ thứ hai có vẻ rõ ràng hơn đối với tôi.
SqlTransactiontransaction=null;
using(varconnection=newSqlConnection())
using(varcmd=newSqlCommand())
{
try
{
connection.Open();
transaction=connection.BeginTransaction();
cmd.Connection=connection;
cmd.Transaction=transaction;
cmd.CommandText="InsertintoCustomers(Name)values('Dimitri')";
cmd.ExecuteNonQuery();
cmd.CommandText="InsertintoCustomers(Name)values('George')";
cmd.ExecuteNonQuery();
transaction.Commit();
transaction.Dispose();
transaction=null;
}
catch
{
if(transaction!=null)
{
try{transaction.Rollback();}catch{}
}
}
}
Cả hai đều có cùng một kết quả? Cái nào trong hai cái thích hơn?
Trả lời
Cả hai phương pháp đó đều không tốt. Chúng quá dài dòng.
Phương pháp tốt nhất là chỉ cần đưa Transaction
vào using
, chúng ta cũng nên sử dụng một tham số cho truy vấn:
using(var connection = new SqlConnection(connString))
using(var cmd = new SqlCommand("Insert into Customers (Name) values (@Name));"))
{
var param = cmd.Parameters.Add("@Name", SqlDbType.VarChar, insert_column_length_here);
connection.Open();
using(var transaction = connection.BeginTransaction())
{
cmd.Transaction = transaction;
param.Value = "Dimitri";
cmd.ExecuteNonQuery();
param.Value = "George";
cmd.ExecuteNonQuery();
transaction.Commit();
}
}
Chúng ta có thể thấy rằng việc loại bỏ đối tượng giao dịch sẽ tự động khôi phục nếu chưa được cam kết, bằng cách xem mã nguồn . Vì vậy, using
sẽ làm sạch mọi thứ.
Nếu bạn cần bắt để hiển thị thông báo cho người dùng, hãy làm điều đó bên ngoài mã tức là đặt try/catch
xung quanh toàn bộ. Đừng tự làm mã dọn dẹp