C# 谁能说出什么';我的交易有错

C# 谁能说出什么';我的交易有错,c#,asp.net,sqltransaction,C#,Asp.net,Sqltransaction,您好,我已经编写了以下事务来插入数据,但是当我得到一个异常时,只有得到该异常的数据没有插入到数据库,其余的都在插入 这是我写的 public bool addWhole(SqlTransaction osqlTrans) { m_flag = false; osqlTrans = null; SqlConnection osqlCon = new SqlConnection(constr); if (osqlCon.State != ConnectionState

您好,我已经编写了以下事务来插入数据,但是当我得到一个异常时,只有得到该异常的数据没有插入到数据库,其余的都在插入

这是我写的

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
。。我该怎么做才能克服这个问题呢?我猜这就是其中之一

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


在执行命令之前,请尝试使用相同的连接对象并将事务分配给该命令。有关示例,请参见MSDN上的本页

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

因为您要在代码不起作用的每个函数中创建新连接。只需断开连接

  `con = new SqlConnection(constr);`
将其替换为功能中可用的连接,即


oRiskConn
,不要将其初始化为新连接。如果您再次这样做,按照您的要求进行的交易将不起作用。在命令对象中还包括
oRiskTrans
。然后它将按照您的要求工作

我不知道您的一些参数是什么,但看起来您需要这样的参数:

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

osqlTrans
的使用令人震惊!