Привязка массива Oracle.DataAccess (ODP.NET) «Значение не попадает в ожидаемый диапазон» - PullRequest
3 голосов
/ 20 июня 2011

мой сценарий

Я использую ODP.NET oracle провайдера с c # 3.5, и я пытаюсь передать массив в качестве параметра для процедуры ... как это:

var paramNames = new OracleParameter();
paramNames.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
paramNames.ParameterName = "P_JOB_TITLE";
paramNames.Size = 2;
paramNames.Value =  new string[2]{ "name1", "name1" };
cmd.Parameters.Add(paramNames);

когда код времени выполнения переходит к paramNames.Value = новая строка [2] {"name1", "name1"}; это ловит с этой ошибкой

«Значение не попадает в ожидаемый диапазон»

Кто-нибудь может это исправить?

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

При указании OracleDbType ошибка исправлена, но при выполнении выдавались ошибки

paramNames.OracleDbType = OracleDbType.Varchar2;

"Невозможно привести объект типа 'System.String []' к типу" System.IConvertible "."

Моя цель - сделать что-то вроде этого

http://aspalliance.com/621_Using_ODPNET_to_Insert_Multiple_Rows_within_a_Single_Round_Trip.3

ДРУГАЯ ПРОБЛЕМА С ВНЕШНИМ ПАРАМЕТРОМ

Вставка такого параметра out

            paramNames = new OracleParameter();
            paramNames.ParameterName = "O_JOB_ID";
            paramNames.Size = 3;
            paramNames.Direction = ParameterDirection.Output;
            paramNames.OracleDbType = OracleDbType.Int32;
            paramNames.Value = new int[3] { 0, 0, 0 }; ;
            cmd.Parameters.Add(paramNames);

заполнено правильно, когда ExecuteNonQuery завершен. Например, процедура pls-sql выполняет 3 вставки, и я возвращаю id строки каждой записи массива.

Но если что-то пошло не так, например, при разборе 2-й строки все параметры OUT (массив) всегда устанавливаются на 0. Я ожидал, что хотя бы параметры [0] .value были улучшены

Спасибо

1 Ответ

5 голосов
/ 20 июня 2011

Я думаю, что вы пытаетесь объединить Array Bind {просто привязать массив к параметру, чтобы он выполнялся несколько раз - это то, как это было сделано в примере в предоставленной вами ссылке} с Ассоциативный массив {re: PLSQLAssociativeArray с параметром INPUT TABLE OF}.

Так как вы не опубликовали свой пакет / процесс, который вы используете, я предполагаю, что вы делаете что-то вроде этого (просто опускаете это, чтобы подтвердить предположение)

procedure insertdata(P_JOB_TITLE IN VARCHAR2) as
begin
insert into myTable(x) value (P_JOB_TITLE);
end  insertdata;

Чтобы выполнить это, как автору статьи, вам нужно использовать ArrayBindCount (посмотрите эту ссылку, у нее также есть пример) . Это также означает, что, если у вас есть несколько параметров, для каждого из них будет ожидаться Массив.

Теперь, чтобы выполнить это для всех P_JOB_TITLE (), которые вы передаете в

//this was missing in your example and MUST be there to tell ODP how many array elements to expect
cmd.ArrayBindCount = 2;

 string[] jobTitleArray = {"name1", "name1"};

OracleParameter paramNames= new OracleParameter("P_JOB_TITLE", OracleDbType.Varchar2);

   //paramNames.CollectionType = OracleCollectionType.PLSQLAssociativeArray;/*once again, you are passing in an array of values to be executed and not a pl-sql table*/

    //paramNames.Size = 2; /* this is unnecessary since it is for a plsql-associative array*/
    paramNames.Value =  jobTitleArray ;
    cmd.Parameters.Add(paramNames);

Для примера plSQLAssociativeArray посмотрите примеры, предоставленные при установке ODP @% ORA_HOME% \ odp.net \ samples \ 2.x \ AssocArray

и для примеров связывания массива (по указанной вами ссылке) @% ORA_HOME% \ odp.net \ samples \ 2.x \ ArrayBind

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