0

如何追踪分布式传输错误?有什么方法可以确定所有连接仍然打开吗?我需要找到没有正确关闭的交易?

当我从适配器填充表时,使用以下代码偶尔会出现分布式事务错误。我怀疑错误可能不在此代码中,但这是错误倾向于弹出的地方,仅在第二次尝试时,第一次总是可以正常工作。

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

我不确定问题出在哪里,但我怀疑这是由于使用了一段OracleDataAdapter时间你已经有一个OracleCommandOracleConnection对象。

我认为使用 anOracleDataReader来填充您的表格并从您的连接中调用Open()andClose()方法会更干净。

在您分配所有参数以oraCommand尝试此操作而不是您的DataAdapter

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

同样,我认为这不一定会“修复”您的事务错误,但它应该确保您在执行存储过程时只有一个打开的连接,从而使连接更易于管理。

以下是使用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 回答