0

こんにちは、データを挿入するために次のトランザクションを作成しましたが、例外が発生すると、例外を取得したデータのみがデータベースに挿入されず、残りのすべてが挿入されます

これは私が書いたものです

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

2 番目の条件に失敗してトランザクションをロールバックしようとしましたが、最初のステートメントがDB.. に挿入されています。これを克服するにはどうすればよいですか

4

4 に答える 4

4

私はそれがこれらのことの1つであると推測しています

1) すべての異なるコマンドに同じ接続オブジェクトを使用していない
2) コマンドを実行する前にトランザクションをコマンドに割り当てていない
3) 両方ともおそらく

例については、MSDN のこのページを参照してください。 http://msdn.microsoft.com/en-us/library/86773566.aspx

于 2011-11-11T13:27:46.590 に答える
3

トランザクションは接続間で共有されず、常に新しい接続を作成します。メソッドの 2 番目のパラメーターとして指定された oRiskConn を使用します。

于 2011-11-11T13:32:31.870 に答える
0

すべての関数で新しい接続を作成しているため、コードは機能しませんでした。接続を外すだけ

  `con = new SqlConnection(constr);`

関数で利用可能な接続に置き換えます。

oRiskConn新しい接続として初期化しないでください。再度行った場合、要件に応じたトランザクションは機能しません。また、oRiskTransコマンド オブジェクトに含めます。その後、それはあなたの要件に従って動作します

于 2011-11-11T14:20:27.330 に答える