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