带有实体框架的out参数(SYS_REFCURSOR)的过程

时间:2014-10-21 20:47:02

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

我正在C#应用程序中执行数据库 SQL Server Oracle 的迁移。提到的应用程序正在使用Entity Framework来访问数据库。

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

  <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>

此映射在开发环境中完美运行,但是当我通过应用程序进行审批时出现以下错误:

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

  • 在服务器批准上安装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;
  • ISS 7.0;
  • 池 - 启用32位应用程序 true ;

如果你能帮助我......

非常感谢提前!

2 个答案:

答案 0 :(得分:2)

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

machine.config中存在<oracle.manageddataaccess.client>

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

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

答案 1 :(得分:0)

我有同样的问题,这向我展示了解决方案的方法。 问题的原因是我通过NUGET安装了OracleManagedDataAccessClient,但其他人已经完成了客​​户端的本机安装。安装客户端后,它在Machine.Config中创建了一个条目。安装NUGET后,它在Web.config中创建了一个条目。在尝试执行时,我收到了以下部分的错误:  &lt; section name =&#34; oracle.manageddataaccess.client&#34; type =&#34; OracleInternal.Common.ODPMSectionHandler,Oracle.ManagedDataAccess,Version = 4.121.2.0,Culture = neutral,PublicKeyToken = 89b483f429c47342&#34; /&GT; 已经存在。我评论了它,我的服务工作但是Oracle会因错误而失败:   &#34; PLS-00306:呼叫中的参数数量或类型错误&#34; 安装客户端时,它是Oracle的早期版本,因此Machine.config中的条目是:  &lt; section name =&#34; oracle.manageddataaccess.client&#34; type =&#34; OracleInternal.Common.ODPMSectionHandler,Oracle.ManagedDataAccess,Version = 4.121。** 1 **。0,Culture = neutral,PublicKeyToken = 89b483f429c47342&#34; /&GT; 由于我在web.config中注释了该条目,因此该应用程序使用了与实际版本不匹配的machine.config条目。 我修改了machine.config中的条目以匹配web.config,现在一切正常。