用户定义类型中不受支持的列数据类型

时间:2020-01-31 19:55:25

标签: c# stored-procedures user-defined-types oracle-manageddataaccess

我不知道ManagedDataAccess缺少什么来抱怨“不支持的列数据类型”。我喜欢错误如何不指出是什么类型或什么“列”给它带来了悲伤。有人可以查看下面的代码,让我知道我错过了什么吗?非常感谢!

桌子

from sshtunnel import SSHTunnelForwarder
import paramiko

with SSHTunnelForwarder(
    (proxyhost, 22),
    ssh_username=ssh_username,
    ssh_pkey=paramiko.agent.Agent().get_keys(),
    remote_bind_address=('127.0.0.1', 3306),
) as tunnel:
    pass

类型

CREATE TABLE "PORTAL_OPS"."SHAPE" 
(   
 "SIDES" NUMBER(1,0) NOT NULL ENABLE
) 

班级

create or replace type shapeudt as object 
( 
  sides number(1,0)
)

调用UDT进行操作:

[OracleCustomTypeMappingAttribute("PORTAL_OPS.SHAPEUDT")]
public class Shape : IOracleCustomType, IOracleCustomTypeFactory
{
    [OracleObjectMappingAttribute("SIDES")]
    public Int32 sides;


    public void FromCustomObject(OracleConnection con, IntPtr pUdt)
    {
        OracleUdt.SetValue(con, pUdt, "SIDES", sides);
    }
    public void ToCustomObject(OracleConnection con, IntPtr pUdt)
    {
        sides = (int)OracleUdt.GetValue(con, pUdt, "SIDES");
    }

    public IOracleCustomType CreateObject()
    {
        return new Shape();
    }
}

1 个答案:

答案 0 :(得分:0)

解决了!

原因: 没有使用正确的OracleDbType。对于UDT,在定义OracleParameter时必须使用OracleDbType.Object。如果您像我一样,请尝试成为Oracle托管驱动程序的粉丝。好吧,您是SOL,因为从19.6版开始,Oracle托管数据访问Nuget仍然不支持OracleDbType.Object。

解决方案: 切换到非托管驱动程序。是的,您必须使用托管驱动程序进行分拆。 从here下移至VS工具。是的,您需要使用由Oracle Universal Installer(OUI)安装的版本。

相关问题