从 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 存储过程

在 ASP.net 中运行时调用存储过程

在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)

执行sql脚本,不等待完成

如何使用存储过程从 ASP.NET 记录计数?

Oracle存储过程创建临时表,插入数据后,怎么返回临时表数据,并在asp.net中接收到datatable中