如何使用c#执行返回多个游标的oracle存储过程
本文关键字:游标 oracle 存储过程 何使用 执行 返回 | 更新日期: 2023-09-27 17:50:38
我使用OracleClient与c#。我有一个返回多个游标的存储过程。我必须将每个游标关联到不同的表。但是当它尝试这样做时,我得到了这个错误。
ORA-24338: statement handle not executed
谁能帮我解决这个问题?
我目前已经实现了这样的代码。所以,让我告诉你我所遵循的步骤。
-
在DAC层,我安排了输入参数和输出参数(RefCursors)
using (DbCommand objCmd = dbObject.GetSqlStringCommand(queryString)) { ... objCmd.Parameters.Add("Ref_CursorName1",OracleDbType.RefCursor,ParameterDirection.Output); objCmd.Parameters.Add("Ref_CursorName2",OracleDbType.RefCursor,ParameterDirection.Output); ... connectoinObj.Open(); objCmd.ExecuteNonQuery();
-
遍历参数count
for (int i = 0; i < objcmd.Parameters.Count; i++) { if(objcmd.Parameters[i].DbType == DbType.Object) { if(!(OracleRefCursor) objCmd.Parameters[i].Value).IsNull) { var cursorParam = ((OracleRefCursor) objCmd.Parameters[i].Value).GetDataReader(); if(cursorParam.HasRows && cursorParam.FieldCount > 0) { MapCursors(cursorParam, objcmd.Parameters[i].ParameterName, response); //type of your response object. } } } }
-
最后一步是MapCursors方法的实现。
private void MapCursors(OracleDataReader cursorParam, string parameterName, ClassName response) { case "Ref_CursorName1": RetriveDataFromRef_CursorName1(cursorParam, response); break; }
-
将光标数据映射到对象(响应)。
OracleClient
?System.Data.OracleClient
吗?不推荐使用。
请尝试使用Oracle的托管。net ODP,在这里找到(ODAC 12c和更高版本是100%托管代码):http://www.oracle.com/technetwork/topics/dotnet/whatsnew/index.html
如果这对你没有帮助,试着发布更多的信息,如数据库版本,连接器版本等。