$ultaNn Ответов: 1

Sql транзакция в использовании кода


как я могу использовать код транзакции в приведенном ниже коде для нескольких запросов

private SqlConnection DBCon
    {
        get { return new SqlConnection(ConfigurationManager.ConnectionStrings[" "].ConnectionString); 
}
    }
  protected DataTable ExecuteQry(string Qry)
    {
        DataTable dt = new DataTable();
        try {
           
            using (SqlConnection myCon = DBCon)
            {
                SqlCommand myCommand = new SqlCommand(Qry, myCon);
                myCommand.CommandType = CommandType.Text;
                //Set Parameters       
                foreach (SqlParameter Parameter in parameter)
                {
                    myCommand.Parameters.AddWithValue(Parameter.ParameterName, Parameter.Value);
                }
                //Execute the command
                SqlDataAdapter da = new SqlDataAdapter(myCommand);
                // Execute the command
                myCon.Open();
                da.Fill(dt);
                myCon.Close();

            }
        }
        catch(Exception ex)
        {
            ex.ToString();
        }
        return dt;
    }


Что я уже пробовал:

я попробовал данный код

protected boolExecuteQry(string Qry,string Qry1)
   {

       try {

                  using (SqlConnection myCon = DBCon)
       {
           myCon.Open();
           using (SqlTransaction tr = myCon.BeginTransaction())
           {
               try
               {
                   if (Qry != "")
                   {
                       SqlCommand myCommand = new SqlCommand(Qry, myCon, tr);
                       myCommand.CommandType = CommandType.Text;
                       foreach (SqlParameter Parameter in parameter)
                       {
                           myCommand.Parameters.AddWithValue(Parameter.ParameterName, Parameter.Value);
                       }
                       myCommand.ExecuteNonQuery();

                   }
if (Qry1 != "")
                   {
                       SqlCommand myCommand = new SqlCommand(Qry1, myCon, tr);
                       myCommand.CommandType = CommandType.Text;
                       foreach (SqlParameter Parameter in parameter)
                       {
                           myCommand.Parameters.AddWithValue(Parameter.ParameterName, Parameter.Value);
                       }
                       myCommand.ExecuteNonQuery();

                   }
           }
       }
       catch(Exception ex)
       {
           ex.ToString();
       }

   }

1 Ответов

Рейтинг:
2

Dave Kreskowiak

Я даже не собираюсь спрашивать, для чего используется этот код. Это выглядит неправильно для любой цели, которую вы намереваетесь.
1) у вас есть две переменные Qry, ни одна из которых не имеет правильного названия для описания того, для чего они используются.

2) Вы можете, по-видимому, выполнить оба запроса, из которых они оба будут использовать один и тот же набор объектов параметров.

3) Ваши параметры поступают откуда-то еще в классе, а не из-за того, что они передаются через аргументы метода.

4) ваша переменная "parameter" также неправильно названа, поскольку она не описывает коллекцию объектов параметров.

5) Ваш внешний блок try/catch, ну, не имеет никакого блока catch!

Но вернемся к нашему вопросу. Вы никогда не совершали транзакцию после успешного завершения запроса.

О, и вы пропустили несколько закрывающих фигурных скобок в нижней части кода.

Ваш измененный код должен выглядеть примерно так:

protected boolExecuteQry(string Qry,string Qry1)
{
    try
    {
        using (SqlConnection myCon = DBCon)
        {
            myCon.Open();
            SqlTransaction tr = myCon.BeginTransaction();

            try
            {
                if (Qry != "")
                {
                    SqlCommand myCommand = new SqlCommand(Qry, myCon, tr);
                    myCommand.CommandType = CommandType.Text;
                    foreach (SqlParameter Parameter in parameter)
                    {
                        myCommand.Parameters.AddWithValue(Parameter.ParameterName, Parameter.Value);
                    }
                    myCommand.ExecuteNonQuery();
                }

                if (Qry1 != "")
                {
                    SqlCommand myCommand = new SqlCommand(Qry1, myCon, tr);
                    myCommand.CommandType = CommandType.Text;
                    foreach (SqlParameter Parameter in parameter)
                    {
                        myCommand.Parameters.AddWithValue(Parameter.ParameterName, Parameter.Value);
                    }
                    myCommand.ExecuteNonQuery();
                }

                tr.Commit();
            }
            catch(Exception ex)
            {
                // Something failed so rollback the transaction.
                tr.Rollback();

                // This line of code does absolutely NOTHING! Why is it here?
                ex.ToString();  
            }
        }
    }
    catch (Exception ex)
    {
        // WHat do you do here if the connection fails to open?
    }
}