我正在重构现有应用程序以将 Oracle 数据提供程序从 OLE DB 更改为托管 Oracle 数据提供程序 (ODP)。
我需要调用以下存储过程,它有几个输入参数和几个输出参数,它们基本上是 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);
where TYPE g_tMarkCd IS TABLE OF my_table.my_varchar_column%TYPE
(和其他类型类似)。
不幸的是,该过程不返回参考光标。
OLE 数据库:
现有代码设置了一个 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 参数)来调用 proc,然后调用 OleDbCommand ExecuteReader() 方法。一切都适用于 OLE DB。生成的 IDataReader 具有每个输出参数的字段。
耗氧量:
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