我最近从ODP Unmanaged转换为ODP Managed(与Entity Framework结合使用)。 在web.config部分添加必要的信息后,Unmanaged驱动程序正常工作。我可以使用函数导入 - 获取列信息添加存储过程并生成复杂类型(我正在尝试使用OUT refcursor参数导入存储过程)。 在切换之后,配置部分已更新以反映新格式,并且一切都在运行时工作(因此格式正确)。
然而,当我尝试再次生成复杂类型(或添加新的函数导入)时,我只得到一个System.notSupportedException Message: The specified type is not supported by this selector)
没有任何指示它是哪个类型/选择器(显然)......
谷歌没有发现任何事情,甲骨文论坛上的主题也没有得到回应。
版本: ODP.Net(ODAC):v12.1(生产版本; DLL v4.121.1.0) EF v5 .NET v4.5 配置文件(略微修剪):
<configSections>
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess"/>
</configSections>
<oracle.manageddataaccess.client>
<version number="*">
<edmMappings>
<edmMapping dataType="number">
<add name="bool" precision="1"/>
<add name="byte" precision="2" />
<add name="int16" precision="5" />
<add name="int32" precision="10" />
<add name="int64" precision="38" />
</edmMapping>
</edmMappings>
<implicitRefCursor>
<storedProcedure schema="ECOM" name="SHP_API_ORDERS.CREATE_ORDER">
<refCursor name="O_RS">
<bindInfo mode="Output"/>
<metadata columnOrdinal="0" columnName="COL1" nativeDataType="Number" providerType="Decimal" allowDBNull="false" numericPrecision="10" numericScale="0" />
<metadata columnOrdinal="1" columnName="COL2" nativeDataType="Date" providerType="Date" allowDBNull="true" />
<metadata columnOrdinal="2" columnName="COL3" nativeDataType="Varchar2" providerType="Varchar2" allowDBNull="false" columnSize="10" />
</refCursor>
</storedProcedure>
</implicitRefCursor>
</version>
</oracle.manageddataaccess.client>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.ManagedDataAccess.Client" />
<add name="ODP.NET, Managed Driver"
invariant="Oracle.ManagedDataAccess.Client"
description="Oracle Data Provider for .NET, Managed Driver"
type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
答案 0 :(得分:4)
Unmanaged ODP.NET和Managed ODP.NET之间的隐式引用游标配置文件格式不同。这可能是你问题的一部分。
为了避免拉扯你的头发,安装最新的Visual Studio(ODT)Oracle Developer Tools并使用自动生成此配置的新功能:
1)如果您还没有
,请安装ODT 12.12)在server explorer中找到存储过程,右键单击并运行它,然后输入输入参数。
3)对于表示实体功能返回值的输出引用光标,选择“添加到配置”复选框。
4)然后选择“显示配置”(然后剪切并粘贴)或“添加到配置”。
以下是我所说的截图:
http://i.imgur.com/t1BfmUP.gif
如果这不能解决问题,请使用该布尔映射。在撰写本文时,我并不是百分之百确定这一点,但我记得听说支持布尔值是托管和非托管ODP.NET之间的另一个区别。我确定它已经隐藏在发行说明或某个地方的文档中。
Christian Shay
的Oracle
答案 1 :(得分:0)
您可能想要尝试的两件事可能会解决问题:
int32
providerType 映射到
您的edmmapping强制执行number(10,0)
nativeDataType ,而不是
你现在拥有的十进制数。对另一方来说等等
列(如删除列长度),直到您没有看到错误或获得不同的错误。答案 2 :(得分:0)
我遇到了同样的错误,我认为我的问题是提供者类型为DOUBLE或DECIMAL。但是,我有一个有你的3列类型的工作。您的问题是数字(10,0)应该是&#34; Int64&#34;的提供者类型。
存储过程:
create or replace PROCEDURE "PROC_ESCC_FIELDS" (p_recordset OUT SYS_REFCURSOR)
AS
BEGIN
OPEN p_recordset FOR
SELECT COL1, COL2, COL3
FROM MyTable;
END PROC_ESCC_FIELDS;
这可以工作并返回光标:
<oracle.manageddataaccess.client>
<version number="*">
<implicitRefCursor>
<storedProcedure schema="SERFIS" name="PROC_V_SERFIS_ESCC_FIELDS">
<refCursor name="P_RECORDSET">
<bindInfo mode="Output" />
<metadata columnOrdinal="0" columnName="COL1" providerType="Int64" allowDBNull="false" nativeDataType="Number" />
<metadata columnOrdinal="1" columnName="COL2" providerType="Date" allowDBNull="true" nativeDataType="Date" />
<metadata columnOrdinal="2" columnName="COL3" providerType="Varchar2" allowDBNull="false" nativeDataType="Varchar2" />
</refCursor>
</storedProcedure>
</implicitRefCursor>
</version>
</oracle.manageddataaccess.client>
Click here for a list of the providerType and nativeDataType, etc. ENUMS: