简体   繁体   English

Oracle.ManagedDataAccess.Core 3.21.61 使用 UDT Oracle 11g 和 c# .net 6

[英]Oracle.ManagedDataAccess.Core 3.21.61 using UDT Oracle 11g with c# .net 6

I'm currently working on upgrading code from .NET 4.5.1 to .NET 6. Currently working on database functionality.我目前正在将代码从 .NET 4.5.1 升级到 .NET 6。目前正在研究数据库功能。 In .NET 4.5.1, I regularly used Oracle UDT as both input and output parameters without issue.在 .NET 4.5.1 中,我经常使用 Oracle UDT 作为输入和输出参数,没有问题。 However, for the life of me I can't get it to work on .NET 6. I'm using an Oracle 11g database, and I'm kind of thinking/hoping that the database version is the issue since there is an Oracle database upgrade planned in the coming months.但是,对于我的一生,我无法让它在 .NET 6 上工作。我使用的是 Oracle 11g 数据库,我有点想/希望数据库版本是问题,因为有一个 Oracle计划在未来几个月内升级数据库。 Otherwise, I might have to delay the upgrade.否则,我可能不得不延迟升级。

I think my code is pretty straight forward.我认为我的代码非常简单。 The UDTTypes are defined in Oracle (and working in .NET 4.5.1) Logically then, that shouldn't be the issue. UDTTypes 是在 Oracle 中定义的(并且在 .NET 4.5.1 中工作)从逻辑上讲,这不应该是问题。 Abbreviated, they look as follows缩写,它们看起来如下

create or replace TYPE "WBH_PLATELIST" IS TABLE OF WBH_PLATEOBJ;

create or replace TYPE "WBH_PLATEOBJ" AS OBJECT 
(
    LPID                VARCHAR2(15 BYTE),
    ITEM                VARCHAR2(50 BYTE)
    ...
)

I have a package with a procedure with signature as below that works just fine.我有一个带有如下签名的程序包,它工作得很好。

PROCEDURE GetInventoryPlates( p_CustId    IN varchar2,
                              p_Plate     OUT WBH_PLATELIST);

I'm using Oracle.ManagedDataAccess.Core v.3.21.61.我正在使用 Oracle.ManagedDataAccess.Core v.3.21.61。 My C# code looks like我的 C# 代码看起来像

string packageProc = "WBH_DEVELOPMENT.GetInventoryPlates";

OracleParameter clientparam = new OracleParameter() 
{   ParameterName = "p_CustId",
    Direction = ParameterDirection.Input, 
    Value = "XZXXX" 
};
OracleParameter plateparam = new OracleParameter()
{
    ParameterName = "p_Plate",
    DbType = DbType.Object,
    OracleDbType = OracleDbType.Object,
    Direction = ParameterDirection.Output,
    UdtTypeName = "ALPS.WBH_PLATELIST",
};

try
{
    using (OracleConnection SqlCon = new OracleConnection(@"Data Source=x.x.x.x:xxx/test;User ID=xxx;Password=xxx"))
    {
        using (OracleCommand SqlCmd = new OracleCommand(packageProc, SqlCon))
        {
            if (paramList != null)
            {
                SqlCmd.BindByName = true;
                SqlCmd.Parameters.Add(clientparam);
                SqlCmd.Parameters.Add(plateparam);
            }
            SqlCmd.CommandType = CommandType.StoredProcedure;
            SqlCmd.Connection.Open();
            SqlCmd.ExecuteNonQuery();
        }
    }
}
catch (OracleException ex)
{
    string log = ex.Message;

}

Seems like no matter what I do, I get the following error as soon as the ExecuteNonQuery function is called.似乎无论我做什么,只要调用 ExecuteNonQuery 函数,我都会收到以下错误。

ORA-06550: line 1, column 13:
PLS-00306: wrong number or types of arguments in call to 'GET_TYPE_SHAPE'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

Can someone please point me in the right direction?有人可以指出我正确的方向吗? Thanks.谢谢。

我现在不记得来源了,但我很确定,我在某处看到,你需要有至少 12.1 的 DB 版本才能将 UDT 与托管驱动程序(正常和“核心”)一起使用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM