ora-01036 недопустимое имя/номер переменной Вызов ExecuteNonQuery с использованием VB.Net

У меня проблема с выполнением запроса Oracle через .NET. Я новичок в вызове команд Oracle из .Net (я исхожу из фона mySQL), поэтому любая помощь очень ценится!

Сначала я создаю строку запроса...

declare 
pDate date; 
pErrorCode binary_integer; 
pErrorInfo varchar2(500); 
begin 
date := to_date(:Date, 'YYYY-MM-DD'); 
AnUpdateRoutine(:VehicleID, :ContractID, :DriverID, :pDate, :pDriverContribution, pErrorCode, pErrorInfo); 
end;

Затем я добавляю свои параметры...

cmd2.Parameters.Add(":VehicleID", OracleDbType.Int32).Value = CInt(HiddenField.Get("ID"))
cmd2.Parameters.Add(":ContractID", OracleDbType.Int32).Value = CInt(HiddenField.Get("ContractID"))
cmd2.Parameters.Add(":DriverID", OracleDbType.Int32).Value = CInt(cbCurrentDriver.Value)
cmd2.Parameters.Add(":pDate", OracleDbType.Date).Value = Date.Now()
cmd2.Parameters.Add(":pDriverContribution", OracleDbType.NVarchar2).Value = DBNull.Value
cmd2.Parameters.Add("pErrorCode", OracleDbType.NVarchar2).Value = 0
cmd2.Parameters.Add("pErrorInfo", OracleDbType.NVarchar2).Value = 0
cmd2.ExecuteNonQuery()

При вызове ExecuteNonQuery() я получаю исключение... ORA-01036: недопустимое имя/номер переменной

Определение процедуры

procedure AnUpdateRoutine(pVehicleID in T_FM_VEHICLE.F_VEH_ID%type,
                              pContractID in T_FM_CONTRACT.F_CON_ID%type,
                              pDriverID in T_FM_DRIVER.F_DVR_ID%type,
                              pDateTimeOn in date,
                              pDriverContribution in T_FM_DRIVER_CHG.F_DCH_DVR_CONTRIBUTION%type,
                              pErrorCode out binary_integer,
                              pErrorInfo out TErrorInfo);

pVehicleID, pContractID, pDriverID и pDateTimeOn являются обязательными.


person Michael B    schedule 13.01.2015    source источник
comment
У вас есть 6 переменных связывания в анонимном блоке, и вы устанавливаете 7 параметров в своем коде .Net. Итак, зачем вообще нужен анонимный блок? Просто используйте ExecuteNonQuery для прямого вызова AnUpdateRoutine. Другое дело - ваш последний параметр имеет пользовательский тип, но вы пытаетесь заполнить им varchar2   -  person T.S.    schedule 14.01.2015
comment
Вам, вероятно, потребуется написать класс с атрибутом OracleCustomTypeMappingAttribute, чтобы создать тип, который будет отображаться в TErrorInfo.   -  person T.S.    schedule 14.01.2015


Ответы (1)


Я могу ошибаться, потому что прошло много времени с тех пор, как на меня наложили Оракул, но...

pErrorCode должен быть: pErrorCode

Та же проблема с :pErrorInfo?

person Martin Milan    schedule 13.01.2015
comment
Спасибо, но когда я добавил двоеточие перед pErrorCode и pErrorInfo, это выдало мне ошибку: ORA-01008: не все переменные привязаны. Первоначально я опустил двоеточие, потому что это параметры OUT. Знаете ли вы, правильно ли это? - person Michael B; 13.01.2015
comment
Обратите внимание, приятель - это было давно... Хотя это не звонит в колокольчик - и не кажется логичным, что направление параметра должно влиять на именование... - person Martin Milan; 15.01.2015