【发布时间】:2017-11-22 05:26:52
【问题描述】:
在 oracle 12C 数据库中创建了一个包,并有 C# 代码来调用它。执行NoQuery 时出现错误“参数数量或类型错误”,如下所示。检查包签名并与 C# 中的代码进行比较。无法弄清楚这个问题。唯一不确定的类型是映射 Oracle 编号 (10)。试图用 OracleDbType.varchar2、int32、int64 和 Long 映射它,但得到了同样的错误。下面是包签名和 C# 代码。我想知道我所做的有什么问题,有人可以提供帮助。
包装:
create or replace PACKAGE GETIMPOSITION AS
TYPE impTyp IS TABLE OF varchar2(200);
TYPE impNm IS TABLE OF varchar2(255);
TYPE impTax IS TABLE OF char(1);
TYPE impIncld IS TABLE OF char(1);
TYPE impId IS TABLE OF varchar2(8);
TYPE impSkuId IS TABLE OF number(10,0);
TYPE impPmCd IS TABLE OF varchar2(15);
/* Get data from each OUT parameter */
procedure RMS_GET_IMPOSITION_INFO (
O_IMPOSITIONTYPES OUT impTyp,
O_ERRORDES OUT VARCHAR2,
O_ERRORCODE OUT VARCHAR2
);
END GETIMPOSITION;
C#代码:
int[] aRraybindingSize = new int[2000];
List<string> empty = new List<string>();
for (int i = 0; i < arrBindingSize.Length; i++)
{
empty.Add(string.Empty);
}
using (OracleConnection database = new OracleConnection(connString))
{
OracleCommand dbCommand = database.CreateCommand();
dbCommand.CommandType = System.Data.CommandType.StoredProcedure;
dbCommand.CommandText = ConfigurationManager.AppSettings.Get("StoredProcedureNameIMPSEX");
OracleParameter[] oracleParam = new OracleParameter[3];
oracleParam[0] = new OracleParameter("O_IMPOSITIONTYPES", OracleDbType.Varchar2, 100);
oracleParam[0].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
oracleParam[0].Direction = ParameterDirection.Output;
oracleParam[0].Size = empty.Count;
oracleParam[0].ArrayBindSize = arrBindingSize;
for (int i = 0; i < arrBindingSize.Length; i++)
{
oracleParam[0].ArrayBindSize[i] = 100;
}
oracleParam[0].Value = empty.ToArray();
dbCommand.Parameters.Add(oracleParam[0]);
oracleParam[1] = new OracleParameter("O_ERRORDES", OracleDbType.Varchar2, 512); oracleParam[1].Direction = System.Data.ParameterDirection.Output;
oracleParam[2] = new OracleParameter("O_ERRORCODE", OracleDbType.Varchar2, 512);
oracleParam[2].Direction = System.Data.ParameterDirection.Output;
dbCommand.Parameters.AddRange(oracleParam);
database.Open();
int status = dbCommand.ExecuteNonQuery();
}
将程序更改为只有一个 OUTPUT 数组(如上所示),但仍然出现相同的错误。如果将其更改为不是数组,则过程和 C# 代码从数据库调用中获得正确的数据。对我来说,当 C# 代码谈论过程时,他们彼此不了解 PLSQLAssociativeArray 是什么。添加状态作为返回参数不是问题。这不是 oracle 函数调用。没有返回值的执行非查询很好,所以行 int 状态可以消失。对 PLSQLAssociativeArray 有何评论?这是任何错误。还是需要改程序?
【问题讨论】:
-
当执行到 ExecuteNonQuery() 时,C# 代码抛出异常为“参数数量或类型错误”
-
我相信您的帖子与this 重复,接受的答案会对您有所帮助。
-
感谢您的评论杰夫。但我使用 Oracle SQL 开发人员运行这个包,它运行良好。有什么想法吗?
-
只使用一个参数创建一个最小示例,直到您找出导致问题的原因。可能有不止一种类型导致问题。但是通过创建一个更简单的案例,您将能够更好地解决问题。
-
好主意。会尝试的。谢谢