सबसे अच्छा तरीका है TryTransaction का उपयोग करने के लिए पकड़ने का प्रयास करें

Jan 27 2021

अब तक मैं अपने प्रश्नों के लिए दो कोशिश पकड़ने वाले ब्लॉक का उपयोग कर रहा हूं। यदि कनेक्शन स्थापित नहीं है, तो पहले वाला एक त्रुटि फेंक देगा। यदि दूसरा SqlCommandसफलतापूर्वक निष्पादित होता है तो दूसरा चेक । नीचे दिए गए उदाहरण की तरह

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
{

}

मुझे एक दूसरा उदाहरण मिला जो मेरे लिए अधिक स्पष्ट दिखता है।

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{}
   }
 }
}

क्या दोनों का परिणाम समान है? दो में से कौन अधिक बेहतर है?

जवाब

2 Charlieface Jan 28 2021 at 00:18

दोनों में से कोई भी तरीका अच्छा नहीं है। वे बहुत क्रियात्मक हैं।

सबसे अच्छी विधि सिर्फ Transactionएक usingअच्छी तरह से रखना है, हमें क्वेरी के लिए एक पैरामीटर का उपयोग करना चाहिए:

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();
    }
}

हम देख सकते हैं कि स्रोत कोड को देखकर, यदि पहले से ही प्रतिबद्ध नहीं है, तो लेनदेन ऑब्जेक्ट को निपटाना स्वचालित रूप से रोलबैक होगा । तो usingसब साफ कर देगा।

यदि आपको उपयोगकर्ता को संदेश प्रदर्शित करने के लिए पकड़ने की आवश्यकता है, तो इसे कोड के बाहर करें अर्थात try/catchपूरी चीज़ के चारों ओर रखें। सफाई कोड स्वयं न करें