无法将类型 'System.Int32[]' 的对象强制转换为类型"系统.从 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[]"的对象强制转换为类型 "系统可逆"。

下面的这些行会导致异常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 存储过程中

最新更新