从 ASP.NET 调用 Oracle 存储过程时,无法将“System.Int32[]”类型的对象转换为“System.IConvertible”类型
Posted
技术标签:
【中文标题】从 ASP.NET 调用 Oracle 存储过程时,无法将“System.Int32[]”类型的对象转换为“System.IConvertible”类型【英文标题】:Unable to cast object of type 'System.Int32[]' to type 'System.IConvertible when calling Oracle stored procedure from ASP.NET 【发布时间】:2018-05-14 19:47:47 【问题描述】:我使用整数数组将值传递给 Oracle 存储过程
Oracle 中的数据类型 => 数字
存储过程:
create or replace PROCEDURE SP_ACCESS
(
UserID IN CHECKINOUT.USERID%TYPE
)
IS
BEGIN
INSERT INTO CHECKINOUT ("USERID")
VALUES (UserID);
COMMIT;
END;
ASP.NET 代码:
int[] arrUID = UID.ToArray();
OracleConnection connection = new OracleConnection();
connection.ConnectionString = Obj.GetOraConnectionString();
OracleCommand command = new OracleCommand();
command.Connection = connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "SP_ACCESS";
command.Parameters.Add("@USERID", OracleDbType.Int32);
command.Parameters[0].Value = arrUID;
connection.Open();
command.ExecuteNonQuery();
执行时出现以下错误:
无法将“System.Int32[]”类型的对象转换为类型 'System.IConvertible'。
【问题讨论】:
command.Parameters[0].Value
期待 System.Int32
类型,您分配的是 System.Int32[]
(int 数组)
您不能将数组作为参数值传递。
【参考方案1】:
下面的这些行会导致异常,因为 OracleCommand
参数需要 int
的数据类型,而您正在传递 int[]
数组的值(默认情况下也不使用数组绑定)。
command.Parameters.Add("@USERID", OracleDbType.Int32);
command.Parameters[0].Value = arrUID;
如果你只是想传递单个元素,使用数组索引号来赋值。
command.Parameters[0].Value = arrUID[0];
但是,如果您想将整个数组内容传递给存储过程参数,请尝试在分配值之前将 OracleCollectionType.PLSQLAssociativeArray
设置为 CollectionType
属性(旁注:可能需要先声明架构级别类型在存储过程中使用之前,请参见参考资料(1)):
command.Parameters.Add("@USERID", OracleDbType.Int32);
command.Parameters[0].CollectionType = OracleCollectionType.PLSQLAssociativeArray;
command.Parameters[0].Value = arrUID;
// ExecuteNonQuery afterwards
或者只是在分配参数值之前设置ArrayBindCount
属性:
command.BindByName = true;
command.ArrayBindCount = UID.Count; // assumed UID is a List<int>
command.Parameters.Add("@USERID", OracleDbType.Int32);
command.Parameters[0].Value = arrUID;
// ExecuteNonQuery afterwards
其他参考资料:
(1)C# 2010, ODP.net, call stored procedure passing array
(2)Oracle stored procedure using array as parameter for table insert
(3)Pass a list of integers from C# into Oracle stored procedure
【讨论】:
以上是关于从 ASP.NET 调用 Oracle 存储过程时,无法将“System.Int32[]”类型的对象转换为“System.IConvertible”类型的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET 调用具有多个输入值的 MySQL 存储过程