任何人都能说出我的交易中的错误

时间:2011-11-11 13:21:39

标签: 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;
            }
   }

我试图通过失败第二个条件来回滚事务,但我的第一个语句是插入DB ..我该怎么做才能克服这个问题

4 个答案:

答案 0 :(得分:4)

我猜测其中的一件事

1)您没有为所有不同的命令使用相同的连接对象
2)在执行命令之前,您没有将事务分配给命令 3)也许

尝试使用相同的连接对象并在执行命令之前将事务分配给命令,以获取示例,请参阅MSDN上的此页面。 http://msdn.microsoft.com/en-us/library/86773566.aspx

答案 1 :(得分:3)

连接之间不共享事务,您始终创建新连接。使用指定为方法的第二个参数的oRiskConn。

答案 2 :(得分:0)

当您在每个函数中创建新连接时,您的代码无效。只需删除连接

即可
  `con = new SqlConnection(constr);`

将其替换为您的功能中可用的连接,即

oRiskConn并且不要将其初始化为新连接。如果您再次这样做,您的交易将根据您的要求无效。还在命令对象中包含oRiskTrans。然后它将按照您的要求运作

答案 3 :(得分:0)

我不知道你的一些参数是什么,但看起来你想要这样的东西:

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