Как вызвать функцию Oracle с помощью поставщика oracle .Net?

Когда я использую старую Oracle Dll в своем проекте .net mvc, она работает:

   cmd.CommandText = "dba.user_login";
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.Add("KUL", OracleType.VarChar).Value = userName;
   cmd.Parameters.Add("SIFRE", OracleType.VarChar).Value = pass;
   cmd.Parameters.Add("FLAG", OracleType.Float).Value = 1;
   cmd.Parameters.Add("HATA", OracleType.VarChar).Value = "error";
   cmd.Parameters.Add("result", OracleType.Float).Direction = ParameterDirection.ReturnValue;

Но я хочу использовать нового провайдера oracle .net из-за того, что старая dll oracle устарела. я пробовал это:

   cmd.CommandText = "dba.user_login";
   cmd.CommandType = CommandType.StoredProcedure;
   cmd.Parameters.Add("KUL", OracleDbType.Varchar2).Value = userName;
   cmd.Parameters.Add("SIFRE", OracleDbType.Varchar2).Value = pass;
   cmd.Parameters.Add("FLAG", OracleDbType.Single).Value = 1;
   cmd.Parameters.Add("HATA", OracleDbType.Varchar2).Value = "error";
   cmd.Parameters.Add("result", OracleDbType.Single).Direction = ParameterDirection.ReturnValue;

Но это не работает. Исключение: ORA-06502: PL/SQL: ошибка числа или значения: ошибка преобразования символа в число\nORA-06512: в строке 1 Кто-нибудь может помочь мне исправить это. Спасибо.


person blackraist    schedule 15.02.2013    source источник
comment
идите вперед и опубликуйте определение функции, которую вы вызываете. Имейте в виду, что ODP.net (я подозреваю, что это «новый провайдер оракула», о котором вы говорите) привязывается по положению по умолчанию (отрыв от System.Data.Ora по умолчанию) - вы можете использовать BindByName = true для заставить объект команды вести себя одинаково.   -  person Harrison    schedule 15.02.2013
comment
я использую 11.2.0 ODP.net (Oracle.DataAccess.dll). я вставил BindByName = true =› и он работает. Большое спасибо.   -  person blackraist    schedule 15.02.2013


Ответы (1)


Удивительно, что одно дизайнерское решение всегда приводит к проблемам в начале его использования (а иногда и в дальнейшем!)

Поскольку это ответило на ваш вопрос, я «повыслю» свой комментарий до ответа (если это неправильно, дайте мне знать, и я удалю этот ответ)

Имейте в виду, что ODP.net привязывается по положению по умолчанию (отрыв от System.Data.Ora по умолчанию) - вы можете использовать

BindByName = true 

чтобы заставить объект команды вести себя одинаково

person Harrison    schedule 15.02.2013
comment
для записи, последнее: когда я вызываю хранимую процедуру с помощью System.Data.Ora, cmd.ExecuteNonQuery() возвращает 1, но теперь я использую ODP.net, а cmd.ExecuteNonQuery() возвращает -1. Почему возвращаемое значение изменилось с 1 на -1, я не знаю, но, согласно MSDN, ExecuteNonQuery всегда будет возвращать -1 для вызовов хранимых процедур. Еще раз спасибо. - person blackraist; 15.02.2013
comment
взгляните на этот ответ возвращаемое значение oracle dataaccess выполнить не сохраненный запрос proc "> stackoverflow.com/questions/6955632/ - person Harrison; 15.02.2013