Oracle 图元框架中的铁路超高映射系统参考光标

Oracle 图元框架中的铁路超高映射系统参考光标,oracle,entity-framework,ado.net,oracle11g,odp.net,Oracle,Entity Framework,Ado.net,Oracle11g,Odp.net,我正在尝试通过Entity Framework访问Oracle 11g上的存储过程。我可以访问返回标量和返回正确值的存储过程。但是当使用SYS\u REFCURSOR返回结果集时,在函数导入上未检测到OUT参数 我的存储过程如下所示 create or replace PROCEDURE "GetAllClientNames" ( "ID" IN NUMBER, "SAL" IN NUMBER, "EMP_CURSOR" OUT SYS_REFCURSOR) IS BEGIN

我正在尝试通过Entity Framework访问Oracle 11g上的存储过程。我可以访问返回标量和返回正确值的存储过程。但是当使用SYS\u REFCURSOR返回结果集时,在函数导入上未检测到OUT参数

我的存储过程如下所示

create or replace PROCEDURE "GetAllClientNames" (
  "ID" IN NUMBER, 
  "SAL" IN NUMBER, 
  "EMP_CURSOR" OUT SYS_REFCURSOR) IS

BEGIN 


    OPEN EMP_CURSOR FOR SELECT FIRSTNAME FROM CLIENTS;

END;
但在更新实体并执行函数导入时,在用于检索结果集的导入函数中未检测到SYS_REFCURSOR OUT参数


请帮我解决这个问题。如果不获取参数,我将无法访问存储过程检索到的结果集。我遇到了类似的问题

经过长时间的研究,我发现Oracle对entity framework的支持还没有演变为使用复杂数据类型作为存储过程的返回类型。这是可以做到的;但这就像用鼻子绕着你的头。因此,如果您为了方便而使用EF,那么最好避免使用它,而是直接使用存储过程


最后,我决定使用EF进行创建、更新和删除(因为我必须实施审计跟踪)以及用于返回结果集的存储过程。

如果您想执行具有复杂返回类型和二进制字段的存储过程和函数,我认为使用实体框架的oracle方式不是一个好方法。

使用实体框架的oracle存储过程可以返回复杂类型,例如ref游标;它只需要一点额外的配置。必须将适当的XML添加到配置文件中,以标识返回的refcursor和列的数据类型

例如:

<oracle.dataaccess.client>
<settings>
  <add name="schema.storedproc.RefCursor.ref_cursor_param_name" value="implicitRefCursor bindinfo='mode=Output'" />
  <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.0" value="implicitRefCursor metadata='ColumnName=<column_name_here>;BaseColumnName=<column_name_here>;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" />
  <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.1" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Date;ProviderType=Date'" />
  <add name="schema.storedproc.RefCursorMetaData.OUT_REF_CUR.Column.2" value="implicitRefCursor metadata='ColumnName=<column_name_here>;NATIVEDATATYPE=Number;ProviderType=Int32'" />
</settings>
</oracle.dataaccess.client>


关于XML条目的文档:

现在oracle数据提供程序允许这种操作而不需要太多的麻烦。这里的答案太复杂了。增加了快速阅读。有关详细信息,请点击以下链接

ODP.NET 11g第2版(11.2.0.3.0)及更高版本支持应用程序 使用REF CURSOR参数运行存储过程而不使用 NET代码中这些参数的显式绑定

对于只读结果集,例如使用 OracleDataReader,检索引用游标架构信息 自动地

对于某些场景,例如当可更新的引用游标或实体 如果使用框架,开发人员需要定义REF-CURSOR模式 信息,以便应用程序可以绑定隐式REF游标。 实体框架应用程序使用隐式REF游标绑定到 从引用游标数据实例化复杂类型。申请必须 在app.config中指定REF游标绑定和元数据信息, web.config或machine.config.NET配置文件

还将使用.NET配置文件中提供的属性 当应用程序从 表示引用游标的OracleDataReader对象。这意味着 对于使用“从单个表中选择”创建的引用游标, 应用程序可以通过使用 OracleDataAdapter和OracleCommandBuilder

使用实体框架时,函数导入可以返回 隐式绑定REF游标。REF游标可以作为 复杂类型或实体类型的集合。返回复杂类型的步骤 集合时,.NET配置文件需要定义引用游标 绑定和元数据信息。要返回实体类型集合, 只有绑定信息需要在.NET中定义 配置文件


查找完整信息要将导入功能与EF一起使用,您需要执行以下操作:

1) 参数列表中遇到的先出SYS_REFCURSOR将成为实体函数的输出。因此,您可能需要使用包含此OUT SYS\U REF游标的新SP包装SP或函数

2) 您需要在app.config或web.config中设置有关此游标的一些元数据。这由服务器资源管理器中的“运行存储过程”对话框自动执行

您可以在此处查看此功能的逐步演练:


有关此主题的更多文档,请参阅Oracle Developer Tools For Visual Studio联机帮助的实体框架部分。

您“导入”存储过程的过程是什么?@TomHalladay存储过程必须作为函数导入,以便可以从实体框架调用。感谢您的回答。为了进一步帮助提问者,不仅要评论什么是不好的做法,还要评论什么是建设性的前进道路。在这种情况下,什么是好的或更好的方法?您好-那么您如何从EF调用SP?如下所示:var result=db.Database.SqlQuery(“call OWI_ADMIN.S_LANDEN()”)??您不再需要手动创建带有元数据的配置文件,您也永远不想这样做。“运行存储过程”向导将为您执行此操作。“文章”的链接已经过时了。使用此选项,请参阅本页其他地方的答案。