【发布时间】:2022-06-21 19:48:45
【问题描述】:
我目前正在将代码从 .NET 4.5.1 升级到 .NET 6。目前正在研究数据库功能。在 .NET 4.5.1 中,我经常使用 Oracle UDT 作为输入和输出参数,没有问题。但是,对于我的一生,我无法让它在 .NET 6 上工作。我使用的是 Oracle 11g 数据库,我有点想/希望数据库版本是问题,因为有一个 Oracle计划在未来几个月内升级数据库。否则,我可能不得不推迟升级。
我认为我的代码非常简单。 UDTTypes 是在 Oracle 中定义的(并且在 .NET 4.5.1 中工作)从逻辑上讲,这不应该是问题。缩写,它们如下所示
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)
...
)
我有一个带有如下签名的程序包,它工作得很好。
PROCEDURE GetInventoryPlates( p_CustId IN varchar2,
p_Plate OUT WBH_PLATELIST);
我正在使用 Oracle.ManagedDataAccess.Core v.3.21.61。我的 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;
}
似乎无论我做什么,只要调用 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
有人可以指出我正确的方向吗?谢谢。
【问题讨论】:
标签: c# oracle user-defined-types