0

分散トランスエラーを追跡するにはどうすればよいですか? すべての接続がまだ開いていることを確認する方法はありますか? 適切にクローズされなかったトランザクションを見つける必要がありますか?

アダプターからテーブルに入力すると、次のコードで時折分散トランザクション エラーが発生します。エラーはこのコードにはない可能性があると思われますが、これはエラーが発生する傾向がある場所であり、2 回目の試行でのみ、最初の試行は常に正常に機能します。

using (OracleConnection oraConnection = new OracleConnection(connectionString)){
 using (OracleCommand oraCommand = new OracleCommand( "DB_SCHEMA." + rmd.storedprocName, oraConnection )){
    oraCommand.CommandType = CommandType.StoredProcedure;

    if ( rmd.parameters != null ){
        for ( int i = 0; i <= rmd.parameters.GetUpperBound( 0 ); i++ )
        {
            OracleParameter oraParameter = new OracleParameter();
            oraParameter.ParameterName = rmd.parameterNames[ i ];
            oraParameter.OracleDbType = rmd.parameterTypes[ i ];
            oraParameter.Size = 15;

            string dataType = oraParameter.OracleDbType.ToString().ToUpper();

            switch ( dataType )
            {
                case "VARCHAR2":
                    oraParameter.Value = rmd.parameters[ i ].ToString();
                    break;
                case "CHAR":
                    oraParameter.Value = rmd.parameters[ i ].ToString();
                    break;
                case "NUMBER":
                    oraParameter.Value = Convert.ToDouble( rmd.parameters[ i ] );
                    break;
                case "DATE":
                    oraParameter.Value = Convert.ToDateTime( rmd.parameters[ i ] );
                    break;
                default:
                    oraParameter.Value = rmd.parameters[ i ].ToString();
                    break;
            }

            oraCommand.Parameters.Add( oraParameter );

        }
    }

  oraCommand.Parameters.Add( "RS", Oracle.DataAccess.Client.OracleDbType.RefCursor).Direction = ParameterDirection.Output;
   OracleDataAdapter oraDataAdapter = new OracleDataAdapter( oraCommand );
   oraDataAdapter.Fill( dataTable );  //< -- error is thrown here
 }
}
4

1 に答える 1

0

問題がどこから発生しているのか正確にはわかりませんが、 andオブジェクト OracleDataAdapterが既にある whileの使用が原因であると思われます。OracleCommandOracleConnection

を使用しOracleDataReaderてテーブルを埋め、接続からOpen()andClose()メソッドを呼び出すと、よりクリーンになると思います。

すべてのパラメータを割り当てた後、次oraCommandの代わりにこれを試してくださいDataAdapter

    oraConnection.Open();
    OracleDataReader dr = oraCommand.ExecuteReader();
    dataTable.Load(dr);
    oraConnection.Close();

繰り返しますが、これで必ずしもトランザクション エラーが「修正」されるとは思いませんが、ストアド プロシージャの実行時に開いている接続が 1 つだけになるようにして、接続をより管理しやすくする必要があります。

TransactionScopeデータ アクセスにオブジェクトを使用する例を次に示します。

    try
    {
        using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions(){IsolationLevel = IsolationLevel.ReadCommitted}))
        try
        {
            CallYourDataAccessMethodsHere();
            scope.Complete();
        }
        catch (Exception ex)
        {
            //Handle or log the error during the transaction
        }
    }
    catch (Exception ex)
    {
        //This will catch a TransactionAbortedException and hopefully help track down the problem
    }
于 2013-05-16T17:08:45.150 に答える