【问题标题】:Procedure with out parameter (SYS_REFCURSOR) with Entity Framework带有实体框架的不带参数 (SYS_REFCURSOR) 的过程
【发布时间】:2014-12-17 05:26:58
【问题描述】:

我正在 C# 应用程序中将数据库 SQL Server 迁移到 Oracle。提到的应用程序是使用实体框架来访问数据库。

在这个数据库中有一个程序返回一个“ComplexType”,我研究发现Oracle不理解“ComplexType”,我需要在web.xml中进行输出参数的映射。配置,然后:

  <oracle.manageddataaccess.client>
    <version number="*">
      <implicitRefCursor>
        <storedProcedure schema="ALERTA_MPLUS" name="PR_CONSULTA_DADOS_ROBO">
          <refCursor name="CV_1">
            <bindInfo mode="Output" />
            <metadata columnOrdinal="0" columnName="Broker" baseColumnName="Broker" baseSchemaName="ALERTA_MPLUS" baseTableName="tt_Resultado_Final" nativeDataType="Varchar2" providerType="Varchar2" columnSize="50" />
            <metadata columnOrdinal="1" columnName="Companhia" baseColumnName="Companhia" baseSchemaName="ALERTA_MPLUS" baseTableName="tt_Resultado_Final" nativeDataType="Varchar2" providerType="Varchar2" columnSize="100" />
            <metadata columnOrdinal="2" columnName="Metrica" baseColumnName="Metrica" baseSchemaName="ALERTA_MPLUS" baseTableName="tt_Resultado_Final" nativeDataType="Varchar2" providerType="Varchar2" columnSize="50" />
            <metadata columnOrdinal="3" columnName="Q1" baseColumnName="Q1" baseSchemaName="ALERTA_MPLUS" baseTableName="tt_Resultado_Final" nativeDataType="NVarchar2" providerType="NVarchar2" columnSize="50" />
            <metadata columnOrdinal="4" columnName="Q2" baseColumnName="Q2" baseSchemaName="ALERTA_MPLUS" baseTableName="tt_Resultado_Final" nativeDataType="NVarchar2" providerType="NVarchar2" columnSize="50" />
            <metadata columnOrdinal="5" columnName="Q3" baseColumnName="Q3" baseSchemaName="ALERTA_MPLUS" baseTableName="tt_Resultado_Final" nativeDataType="NVarchar2" providerType="NVarchar2" columnSize="50" />
            <metadata columnOrdinal="6" columnName="Q4" baseColumnName="Q4" baseSchemaName="ALERTA_MPLUS" baseTableName="tt_Resultado_Final" nativeDataType="NVarchar2" providerType="NVarchar2" columnSize="50" />
          </refCursor>
        </storedProcedure>
      </implicitRefCursor>
    </version>
  </oracle.manageddataaccess.client>

这个映射在开发环境中完美运行,但是当我通过申请审批时却报错:


我尝试了一些解决方案,但都没有成功:

  • ODAC 安装在服务器上审批;
  • 搜索,我找到了以这种方式指示映射的 Oracle 文档:

    <oracle.dataaccess.client>
      <settings>
        <add name="ALERTA_MPLUS.PR_CONSULTA_DADOS_ROBO.RefCursor.CV_1" value="implicitRefCursor bindinfo='mode=Output'" />
        <add name="ALERTA_MPLUS.PR_CONSULTA_DADOS_ROBO.RefCursorMetaData.CV_1.Column.0" value="implicitRefCursor metadata='ColumnName=Broker;BaseColumnName=Broker;BaseSchemaName=ALERTA_MPLUS;BaseTableName=tt_Resultado_Final;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" />
        <add name="ALERTA_MPLUS.PR_CONSULTA_DADOS_ROBO.RefCursorMetaData.CV_1.Column.1" value="implicitRefCursor metadata='ColumnName=Companhia;BaseColumnName=Companhia;BaseSchemaName=ALERTA_MPLUS;BaseTableName=tt_Resultado_Final;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" />
        <add name="ALERTA_MPLUS.PR_CONSULTA_DADOS_ROBO.RefCursorMetaData.CV_1.Column.2" value="implicitRefCursor metadata='ColumnName=Metrica;BaseColumnName=Metrica;BaseSchemaName=ALERTA_MPLUS;BaseTableName=tt_Resultado_Final;NATIVEDATATYPE=Varchar2;ProviderType=Varchar2'" />
        <add name="ALERTA_MPLUS.PR_CONSULTA_DADOS_ROBO.RefCursorMetaData.CV_1.Column.3" value="implicitRefCursor metadata='ColumnName=Q1;BaseColumnName=Q1;BaseSchemaName=ALERTA_MPLUS;BaseTableName=tt_Resultado_Final;NATIVEDATATYPE=NVarchar2;ProviderType=NVarchar2'" />
        <add name="ALERTA_MPLUS.PR_CONSULTA_DADOS_ROBO.RefCursorMetaData.CV_1.Column.4" value="implicitRefCursor metadata='ColumnName=Q2;BaseColumnName=Q2;BaseSchemaName=ALERTA_MPLUS;BaseTableName=tt_Resultado_Final;NATIVEDATATYPE=NVarchar2;ProviderType=NVarchar2'" />
        <add name="ALERTA_MPLUS.PR_CONSULTA_DADOS_ROBO.RefCursorMetaData.CV_1.Column.5" value="implicitRefCursor metadata='ColumnName=Q3;BaseColumnName=Q3;BaseSchemaName=ALERTA_MPLUS;BaseTableName=tt_Resultado_Final;NATIVEDATATYPE=NVarchar2;ProviderType=NVarchar2'" />
        <add name="ALERTA_MPLUS.PR_CONSULTA_DADOS_ROBO.RefCursorMetaData.CV_1.Column.6" value="implicitRefCursor metadata='ColumnName=Q4;BaseColumnName=Q4;BaseSchemaName=ALERTA_MPLUS;BaseTableName=tt_Resultado_Final;NATIVEDATATYPE=NVarchar2;ProviderType=NVarchar2'" />
      </settings>
    </oracle.dataaccess.client>
    

这是代码返回以下错误(在所有环境中):

 ORA-06550: line 1, colunm 8: PLS-00306:
 wrong number or types of arguments in call to
 'PR_CONSULTA_DADOS_ROBO' ORA-06550: line 1, colunm 8: PL/SQL:
 Statement ignored;
  • 我在另一台机器(另一位开发人员)上发布了应用程序并且也工作了;

一些我认为必要的信息:

  • Visual Studio 2013;
  • Oracle.DataAcess.dll 版本 4.121.1.0;
  • Oracle.ManagedDataAccess.dll 版本 4.121.1.0;
  • 国际空间站 7.0;
  • 池 - 启用 32 位应用程序 true;

如果你能帮我...

提前非常感谢!

【问题讨论】:

    标签: c# oracle entity-framework iis stored-procedures


    【解决方案1】:

    我遇到了同样的问题,这向我展示了解决方法。

    问题的原因是我通过 NUGET 安装了OracleManagedDataAccessClient,但其他人已经完成了客​​户端的本机安装。安装客户端后,它会在 Machine.Config 中创建一个条目。安装 NUGET 后,它会在 Web.config 中创建一个条目。尝试执行时,我收到一个错误,该部分为:

     <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    

    已经存在。我将其注释掉并且我的服务正常工作,但 Oracle 会因错误而失败:

    “PLS-00306:调用中的参数数量或类型错误”

    安装客户端时,它是早期版本的 Oracle,因此 Machine.config 中的条目为:

     <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.**1**.0, Culture=neutral, PublicKeyToken=89b483f429c47342" /> 
    

    由于我评论了web.config中的条目,应用程序使用了与实际版本不匹配的machine.config条目。

    我修改了machine.config 中的条目以匹配 web.config,现在一切正常。

    【讨论】:

      【解决方案2】:

      经过多次尝试和错误设法解决。我不知道这是否是最好的解决方案但有效。

      machine.config 中存在&lt;oracle.manageddataaccess.client&gt; 的定义:

      <configSections>
          <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      </configSections>
      

      所以我在web.config 中添加了这个声明,它运行良好。

      【讨论】:

      • 我在控制台应用程序中遇到了同样的问题,这也解决了它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      • 2011-08-08
      • 2014-03-24
      • 2018-04-04
      • 1970-01-01
      相关资源
      最近更新 更多