1

OracleDataReader(Oracle.DataAccess.Client) を使用した Oracle ストアド プロシージャからの出力データに問題があります。

手順:

    procedure LOAD_BL_REQ_2(P_XML CLOB, P_XML_OUT out CLOB) is
    BEGIN

     P_XML_OUT    := 'TEST1111';

     exception
     when others then
        P_XML_OUT   := 'LOAD_BL_REQ: Error'|| SQLERRM;
    END;

C# コード:

    OracleCommand cmd = new OracleCommand();
    cmd.Connection = OraConnection;
    cmd.CommandText = "IBS.BNT_EQ.LOAD_BL_REQ_2";
    cmd.CommandType = System.Data.CommandType.StoredProcedure;

    OracleParameter result = new OracleParameter();
    result.ParameterName = "P_XML_OUT";
    result.OracleDbType = OracleDbType.Clob;
    result.Direction = System.Data.ParameterDirection.Output;
    cmd.Parameters.Add(result);

    OracleParameter XMLString = new OracleParameter();
    XMLString.ParameterName = "P_XML";
    XMLString.OracleDbType = OracleDbType.Varchar2;
    XMLString.Direction = System.Data.ParameterDirection.Input;

    OracleDataReader dr;

    cmd.Transaction = OraConnection.BeginTransaction();
    try
    {
        XMLString.Value = XML;
        cmd.Parameters.Add(XMLString);
        dr = cmd.ExecuteReader();
        cmd.Transaction.Commit();
    }
    catch (OracleException ex)
    {
        cmd.Transaction.Rollback();
        Log(2, "Transaction fail, exception: " + ex.ToString());
        ORADisconnect();
        return "";
    }

デバッグ プロセスで、dr が表示されます。

    Depth: 0
    FetchSize: 131072
    FieldCount: 0
    HasRows: false

テストのために、カウントコードを追加します:

    while (dr.Read())
    {
        count++;
    }

カウントは常に 0 です。

このコード (例):

  if(dr.IsDBNull(0))
  {
   //etc...
  }

また

  OracleClob oclob;
  oclob = dr.GetOracleClob(0);

例外を返します:

  dr.isdbnull exception: System.InvalidOperationException: Operation is not valid due to the current state of the object.
  at Oracle.DataAccess.Client.OracleDataReader.IsDBNull(Int32 i)
  at GlobalFunc.ORA_BlackList_Test(String XML) in c:\inetpub\project\App_Code\GlobalFunc.cs:line 474

最後に、Oracle SP から CLOB データを取得する必要がありますが、このステップで停止しました。使用: Visual Studio 2012、ASP.Net (Web プロジェクトですが、このコードを WinForms アプリケーションに書き込んで同じ問題を抱えています)、oracle.dataaccess.dll 4.112.3.0

4

3 に答える 3

3

解決策を見つけました!ただし、すべては非常に単純です。

        string XML = "XML Data";
        OracleCommand cmd = OraConnection.CreateCommand();

        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "IBS.BNT_EQ.LOAD_BL_REQ_2";

        OracleParameter result = new OracleParameter();
        result.ParameterName = "P_XML";
        result.OracleDbType = OracleDbType.Clob;
        result.Value = XML;
        result.Direction = System.Data.ParameterDirection.InputOutput;
        cmd.Parameters.Add(result);

        try
        {
            cmd.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.ToString());
        }

        string str = (result.Value as OracleClob).Value;
        MessageBox.Show("Val: " + str);

        OraConnection.Close();

誰かの役に立つかもしれません。

于 2013-07-02T13:05:20.277 に答える
1

dataReader.Read()から実際にデータを取得するには、 を呼び出す必要がありDataReaderます。

また、ODP.NET はデフォルトでパラメータ名を無視し、位置によってバインドすることにも注意してください。つまり、あなたの例ではパラメーターが間違っています。コマンドを作成してから呼び出すか、コマンドのコレクションにcmd.BindByName = true正しい順序で追加してください。Parameters

于 2013-06-28T06:22:05.060 に答える