无法转换类型为#System; Int32 []'的对象从ASP.NET调用Oracle存储过程时键入' System.IConvertible

时间:2018-05-14 19:47:48

标签: c# asp.net oracle

我使用整数数组将值传递给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'

1 个答案:

答案 0 :(得分:2)

以下这些行导致异常,因为OracleCommand参数需要int的数据类型,而您传递int[]数组的值(默认情况下也不使用数组绑定)。 / p>

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