首页 > 解决方案 > 从 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”类型。

标签: c#asp.netoracle

解决方案


下面的这些行导致异常,因为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,调用存储过程传递数组

(2)Oracle存储过程以数组为参数进行表插入

(3)将整数列表从 C# 传递到 Oracle 存储过程


推荐阅读