【问题标题】:Unable to cast object of type 'System.Int32[]' to type 'System.IConvertible when calling Oracle stored procedure from ASP.NET从 ASP.NET 调用 Oracle 存储过程时,无法将“System.Int32[]”类型的对象转换为“System.IConvertible”类型
【发布时间】: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 数组
  • 您不能将数组作为参数值传递。

标签: c# asp.net oracle


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    相关资源
    最近更新 更多