Может кто-нибудь сказать, что не так в моей транзакции - PullRequest
0 голосов
/ 11 ноября 2011

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 11 ноября 2011

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

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

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

3 голосов
/ 11 ноября 2011

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

0 голосов
/ 12 января 2015

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

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;
    }
}
0 голосов
/ 11 ноября 2011

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

  `con = new SqlConnection(constr);`

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...