Может ли кто-нибудь сказать, что не так в моей транзакции

#c# #asp.net #sqltransaction

#c# #asp.net #sqltransaction

Вопрос:

Всем привет, я написал следующую транзакцию для вставки данных, но когда я получаю исключение, только те данные, которые получили исключение, не вставляются в db, остальные все вставляются

Это то, что я написал

 public bool addWhole(SqlTransaction osqlTrans)
{
   m_flag = false;
   osqlTrans = null;

    SqlConnection osqlCon = new SqlConnection(constr);

    if (osqlCon.State != ConnectionState.Open)
    {
        osqlCon.Open();
    }

    osqlTrans = osqlCon.BeginTransaction();

    try
    {
      if (this.addRisk(osqlTrans, osqlCon))
      {
       if (this.addEconomical(osqlTrans, osqlCon))
       {
           osqlTrans.Commit();
       }
      }
     }
    catch (Exception ex)
    {
        osqlTrans.Rollback();
    }
    finally
    {
        osqlCon.Close();
    }
    return m_flag;
}

public bool addRisk(SqlTransaction oRiskTrans, SqlConnection oRiskConn)
{
     con = new SqlConnection(constr);
    if (con.State != ConnectionState.Open)
    {
        con.Open();
    }
    cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('"   id   "','"   str   "','"   dbPercent   "')", con); //Even i tried adding transaction in command statement
            if (cmd.ExecuteNonQuery() > 0)
            {
                m_flag = true;
            }
   }

public bool addEconomical(SqlTransaction oRiskTrans, SqlConnection oRiskConn)
{
     con = new SqlConnection(constr);
    if (con.State != ConnectionState.Open)
    {
        con.Open();
    }
    cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('"   id   "','"   str   "','"   dbPercent   "')", con);//Even i tried adding transaction in command statement
            if (cmd.ExecuteNonQuery() > 0)
            {
                m_flag = true;
            }
   }
  

Я попытался откатить транзакцию, не выполнив второе условие, но мой первый оператор — inserting to DB .. Что я должен сделать, чтобы преодолеть это

Комментарии:

1. Использование osqlTrans ШОКИРУЕТ!

Ответ №1:

Я предполагаю, что это одна из этих вещей

1) Вы не используете один и тот же объект подключения для всех разных команд
2) Вы не назначаете транзакцию командам перед их выполнением
3) Возможно, обе

Попробуйте использовать тот же объект connection и назначить транзакцию команде перед ее выполнением, пример смотрите на этой странице в MSDN.http://msdn.microsoft.com/en-us/library/86773566.aspx

Ответ №2:

Транзакция не распределяется между соединениями, и вы всегда создаете новое соединение. Используйте oRiskConn, указанный в качестве 2-го параметра ваших методов.

Ответ №3:

Поскольку вы создаете новое соединение в каждой функции, ваш код не работал. Просто удалите соединение

   `con = new SqlConnection(constr);`
  

Замените его соединением, доступным в вашей функции, т. е

oRiskConn и не инициализируйте это как новое соединение. Если вы сделали это снова, ваша транзакция в соответствии с вашим требованием не будет работать. Также включите oRiskTrans в свой командный объект. Тогда это будет работать в соответствии с вашими требованиями

Ответ №4:

Я не знаю, каковы некоторые из ваших параметров, но, похоже, вы хотите что-то вроде этого:

 class SomeClass
{
    // These need to be set to appropriate values
    int id, str;
    double dbPercent;
    string constr;

    public bool addWhole()
    {
        var m_flag = false;
        using (var osqlCon = new SqlConnection(constr))
        {
            if (osqlCon.State != ConnectionState.Open)
            {
                osqlCon.Open();
            }

            using (var osqlTrans = osqlCon.BeginTransaction())
            {
                try
                {
                    if (m_flag = this.addRisk(osqlTrans))
                    {
                        if (m_flag = this.addEconomical(osqlTrans))
                        {
                            osqlTrans.Commit();
                        }
                    }
                }
                catch (Exception)
                {
                    // Use $exception in watch window if you are debugging
                    osqlTrans.Rollback();
                }
            }
        }
        return m_flag;
    }

    public bool addRisk(SqlTransaction oRiskTrans)
    {
        var m_flag = false;
        using (var cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('"   id   "','"   str   "','"   dbPercent   "')"))
        {
            cmd.Transaction = oRiskTrans;
            cmd.Connection = oRiskTrans.Connection;
            if (cmd.ExecuteNonQuery() > 0)
            {
                m_flag = true;
            }
        }
        return m_flag;
    }

    public bool addEconomical(SqlTransaction oRiskTrans)
    {
        var m_flag = false;
        using (var cmd = new SqlCommand("insert into tblEnrollmentData (EID,Eyear,Epercent) values('"   id   "','"   str   "','"   dbPercent   "')"))
        {
            cmd.Transaction = oRiskTrans;
            cmd.Connection = oRiskTrans.Connection;

            if (cmd.ExecuteNonQuery() > 0)
            {
                m_flag = true;
            }
        }
        return m_flag;
    }
}