从ASP.NET调用Oracle存储过程时遇类型转换错误求助
解决ASP.NET向Oracle存储过程传递整数数组的类型转换问题
错误原因分析
你遇到的Unable to cast object of type 'System.Int32[]' to type 'System.IConvertible'错误,核心原因是你的Oracle存储过程只接收单个Number类型的UserID参数,但你传入的是int[]数组。Oracle的默认标量参数无法直接接收数组类型,所以触发了类型转换失败的异常。
解决方案一:循环遍历数组,逐个调用存储过程
如果你的数组数据量不大,可以直接遍历数组,每次给存储过程传单个整数参数,代码修改如下:
int[] arrUID = UID.ToArray(); using (OracleConnection connection = new OracleConnection(Obj.GetOraConnectionString())) { connection.Open(); foreach (int userId in arrUID) { using (OracleCommand command = new OracleCommand("SP_ACCESS", connection)) { command.CommandType = CommandType.StoredProcedure; // 传入单个int值,而非数组 command.Parameters.Add("@USERID", OracleDbType.Int32).Value = userId; command.ExecuteNonQuery(); } } }
解决方案二:修改存储过程支持数组参数(高效批量插入)
如果数据量较大,循环调用效率太低,可以修改Oracle端支持数组类型,实现批量插入:
1. 先在Oracle中定义自定义数组类型
CREATE OR REPLACE TYPE NUM_ARRAY AS TABLE OF NUMBER; /
2. 修改存储过程,接收数组参数并批量插入
CREATE OR REPLACE PROCEDURE SP_ACCESS (UserIDs IN NUM_ARRAY) IS BEGIN -- 使用FORALL实现高效批量插入 FORALL i IN UserIDs.FIRST..UserIDs.LAST INSERT INTO CHECKINOUT ("USERID") VALUES (UserIDs(i)); COMMIT; END; /
3. 修改ASP.NET代码,传递数组参数
int[] arrUID = UID.ToArray(); using (OracleConnection connection = new OracleConnection(Obj.GetOraConnectionString())) { connection.Open(); using (OracleCommand command = new OracleCommand("SP_ACCESS", connection)) { command.CommandType = CommandType.StoredProcedure; // 指定参数类型为OracleDbType.Array,关联自定义的NUM_ARRAY类型 OracleParameter param = command.Parameters.Add("@UserIDs", OracleDbType.Array); param.UdtTypeName = "NUM_ARRAY"; // 这里要和Oracle中定义的类型名完全一致 param.Value = arrUID; command.ExecuteNonQuery(); } }
注意事项
- 方案二中,
UdtTypeName必须和Oracle中创建的自定义数组类型名称完全匹配(是否区分大小写取决于你的Oracle配置,建议保持完全一致)。 - 始终使用
using语句自动释放数据库连接和命令对象,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Sam Bin Ham
相关产品推荐
相关产品推荐

