Невозможно привести объект типа «System.Int32 []» к типу «System.IConvertible» при вызове хранимой процедуры Oracle из ASP.NET. - PullRequest
0 голосов
/ 14 мая 2018

Я использовал массив целых чисел для передачи значений в хранимую процедуру Oracle

Тип данных в Oracle => Number

хранимая процедура:

 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 голосов
/ 15 мая 2018

Эти строки ниже вызывают исключение, потому что параметр 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...