Oracle Data Provider - 调用ExecuteReader获取OUT参数

时间:2016-07-28 17:01:57

标签: c# oracle oledb odp.net odp

我正在重构现有的应用程序,以便将Oracle数据提供程序从OLE DB更改为托管Oracle数据提供程序(ODP)。

我需要调用以下存储过程,它有几个输入参数,以及几个OUT参数,基本上是VARCHAR2的TABLE类型

PROCEDURE RetrieveInfo(
p_vParam1               IN          Varchar2,
p_vParam2               IN          Varchar2,
p_vParam3               IN          Varchar2,
p_vParam4               IN          Varchar2,
MARK_CODE               OUT NOCOPY  g_tMarkCd,  
EQPUN_NBR               OUT NOCOPY  g_tEqpunNbr,
CSTMR _ID               OUT NOCOPY  g_tCstmrId,
CNSGN_CSTMR_ID          OUT NOCOPY  g_tCstmrId,
SHPR_CSTMR_ID           OUT NOCOPY  g_tCstmrId);

其中TYPE g_tMarkCd IS TABLE OF my_table.my_varchar_column%TYPE(和其他类型相似)。

不幸的是,该过程不返回Ref Cursor。

OLE DB:

现有代码设置一个OleDbCommand,CommandType为Text,CommandText设置为

"{call MY_SCHEMA.RetrieveInfo(?,?,?,?,{resultset 10000,MARK_CODE,EQPUN_NBR,SHPR_CSTMR_ID,CNSGN_CSTMR_ID,CSTMR_ID})}"

然后通过将四个输入OleDbParameter添加到OleDbCommand对象(但添加任何OUT参数),然后调用OleDbCommand ExecuteReader()方法来调用proc。一切都适用于OLE DB。生成的IDataReader包含每个输出参数的字段。

ODP:

ODP不支持SQL语法(因此我将OracleCommand CommandText设置为proc的名称并将CommandType设置为StoredProcedure)。

有没有办法以与OLE DB相同的方式调用OracleCommand ExecuteReader()方法来设置C#客户端代码?

(如果我必须在命令中明确地将OUT变量设置为参数,那么系统将需要一个重大的重写,如果可能的话,我希望避免这种情况。)

编辑:(不推荐使用)OLEDB代码看起来像

objCommand = new OleDbCommand(); 
objCommand.Connection = oledbConnection; 
objCommand.CommandText = "{call MY_SCHEMA.RetrieveInfo(?,?,?,?,{resultset 10000,MARK_CODE,EQPUN_NBR,SHPR_CSTMR_ID,CNSGN_CSTMR_ID,CSTMR_ID})}";
objCommand.CommandType = CommandType.Text; 

objCommand.Parameters.Add(new OracleParameter("", OracleDbType.Varchar2, ParameterDirection.Input, 2000, value)); 
// repeat for the other input parameters, but not output parameters
IDataReader rdr = objCommand.ExecuteReader();
// the resulting data reader has field count = 5

0 个答案:

没有答案