0

Windowsアプリケーションを使用しています。1 つのデータセットがあります。そこから、for ループを使用して 1 行ずつデータを読み込んでいます。for ループでは、データベースにデータを挿入するためにストアド プロシージャを使用しました (このプロセスは内部 for ループで実行されます)。

しかし、私は1行ずつ読んでいて、ストアドプロシージャを実行しているのではないかと疑っています.3行目に間違ったデータがある場合...例外が発生しています.しかし、2行がデータベースに挿入される前に. したがって、すべてのデータが正しい場合にのみコミットする必要があります。そうでない場合は、ロールバックする必要があります。

どなたかアイデアをください......

for (i = 0; i < Passdataset.Tables[0].Rows.Count - 2; i++)
{
    currentRow = Passdataset.Tables[0].Rows[i];
    if (currentRow == null)
        continue;
    GLItem1 = new taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert();
    GLTrans = new GLTransactionType();
    if (rdoDateFromFile.Checked == true)
    {
        trxdate = currentRow[mapdate].ToString();
    }

    if (singleORdouble != "")
    {
        decimal amount = Convert.ToDecimal(currentRow[amount1].ToString());
        if (amount < 0)
        {
            decimal amt = Math.Abs(amount);
            GLItem1.CRDTAMNT = amt;
        }
        else
        {
            decimal amt1 = Math.Abs(amount);
            GLItem1.DEBITAMT = amt1;
        }
    }

    string con2 = String.Format(@"data source=localhost;initial catalog=TWO;integrated security=SSPI;persist security info=False;packet size=4096");
    SqlConnection strcon = new SqlConnection(con2);

    SqlCommand NextJourna = new SqlCommand("taGetNextJournalEntry", strcon);
    NextJourna.CommandType = CommandType.StoredProcedure;
    NextJourna.CommandText = "taGetNextJournalEntry";
    NextJourna.Parameters.Add("@O_vJournalEntryNumber", SqlDbType.Char, 13);
    NextJourna.Parameters["@O_vJournalEntryNumber"].Direction = ParameterDirection.Output;
    NextJourna.Parameters.Add("@O_iErrorState", SqlDbType.Int, 250);
    NextJourna.Parameters["@O_iErrorState"].Direction = ParameterDirection.Output;
    strcon.Open();

    NextJourna.ExecuteNonQuery();

    foreach (taGLTransactionLineInsert_ItemsTaGLTransactionLineInsert items in LineItems)
    {
        if (items != null)
        {
            SqlCommand myCommand = new SqlCommand("taGLTransactionLineInsert", strcon);
            myCommand.CommandType = CommandType.StoredProcedure;
            myCommand.CommandText = "taGLTransactionLineInsert";
            myCommand.Parameters.Add("@I_vBACHNUMB", SqlDbType.Char).Value = items.BACHNUMB;
            myCommand.Parameters.Add("@I_vCRDTAMNT", SqlDbType.Decimal).Value = items.CRDTAMNT;
            myCommand.Parameters.Add("@I_vDEBITAMT", SqlDbType.Decimal).Value = items.DEBITAMT;
            myCommand.Parameters.Add("@I_vSQNCLINE", SqlDbType.Int).Value = SQNCLINE;
            myCommand.Parameters.Add("@I_vACTNUMST", SqlDbType.Char).Value = items.ACTNUMST;
            myCommand.Parameters.Add("@I_vDSCRIPTN", SqlDbType.Char).Value = items.DSCRIPTN;
            myCommand.Parameters.Add("@I_vJRNENTRY", SqlDbType.Int).Value = nextjournl.Trim();
            myCommand.Parameters.Add("@O_iErrorState", SqlDbType.Int, 250);
            myCommand.Parameters["@O_iErrorState"].Direction = ParameterDirection.Output;
            myCommand.Parameters.Add("@oErrString", SqlDbType.VarChar, 255);
            myCommand.Parameters["@oErrString"].Direction = ParameterDirection.Output;
            SQNCLINE = SQNCLINE + 16384;
            strcon.Open();
            myCommand.ExecuteNonQuery();
        }
    }

    SqlCommand myCommand1 = new SqlCommand("taGLTransactionHeaderInsert", strcon);
    myCommand1.CommandType = CommandType.StoredProcedure;
    myCommand1.CommandText = "taGLTransactionHeaderInsert";

    myCommand1.Parameters.Add("@I_vBACHNUMB", SqlDbType.Char).Value = GLHdr.BACHNUMB;
    myCommand1.Parameters.Add("@I_vREFRENCE", SqlDbType.Char).Value = GLHdr.REFRENCE;
    myCommand1.Parameters.Add("@I_vJRNENTRY", SqlDbType.Int).Value = nextjournl.Trim();
    strcon.Open();
    myCommand1.ExecuteNonQuery();
}
4

0 に答える 0