c# - 从 ASP.NET 调用 Oracle 存储过程时,无法将类型为“System.Int32[]”的对象转换为类型“System.IConvertible”
问题描述
我使用整数数组将值传递给 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”类型。
解决方案
下面的这些行导致异常,因为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
附加参考:
推荐阅读
- algorithm - 递归的步数方法示例
- python - 如何消除 tkinter gui 中的按钮移位
- javascript - 将特定页面重定向到另一个页面和域
- php - 如何在 Controller 中从 MySQL 访问数据属性
- cassandra - cassandra中时间戳的数据类型是什么
- javascript - 在 javascript 中评估 src
- performance - 缓存关联性如何影响性能
- r - '如何使用 ggplot 绘制多项式线和方程,然后将它们组合成一个图'
- reactjs - 如何使用 Jest 在 redux-saga 中测试抛出新错误
- numpy - numpy.linalg.eig 和加载的另一个后续行动