Cách tốt nhất để sử dụng BeginTransaction bằng cách sử dụng try catch

Jan 27 2021

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 SqlCommandcó đượ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

2 Charlieface Jan 28 2021 at 00:18

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 Transactionvà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, usingsẽ 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/catchxung quanh toàn bộ. Đừng tự làm mã dọn dẹp