ODP.NET хранимые процедуры и дополнительные параметры - PullRequest
2 голосов
/ 08 сентября 2011

Я попытался выполнить поиск и не нашел однозначного ответа на свой вопрос.Я делаю переход с SQL Server на Oracle, но все еще использую C # для внешнего интерфейса.Я использую ODP.Net.У меня есть хранимый процесс в Oracle, например:

Create or Replace
Procedure GetFoo
   (cur_z OUT sys_refcursor,
    pub_date   IN   varchar2,
    fname      IN   varchar2 default null,
    lname      IN   varchar2 default null,
    phone      IN   varchar2 default null
   )
 IS
  BEGIN
    ---get some data
  END;

fname, lname и phone являются необязательными параметрами.В моем коде C # я установил OracleCommand.BindByName = true, который я прочитал, должен позволить мне исключить отправку любых параметров, в которых нет значений для отправки. Например, мне просто нужно отправить курсор, pub_dateи телефон для поиска записи, которая соответствует только номеру телефона.Тем не менее, при вызове этого из C #, хотя и только добавляя параметры для курсора, pub_date и phone, я продолжаю получать сообщение об ошибке: «неправильный номер или типы аргументов при вызове GetFoo». Затем, если я отправлю курсор, pub_date иFname и оставляя пустым, я получаю результаты, и все работает хорошо. Кажется, что вы не можете пропустить какие-либо параметры независимо от настройки BindByName. Если это правильное поведение, то я могу обойти это, но это немного странно (хорошохотя бы из моего опыта работы с SQL Server), и я хочу убедиться, что я что-то не пропустил.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 08 сентября 2011

AFAIK BindByName предназначен для использования в привязке к привязке по позиции ... он не имеет ничего общего с параметрами по умолчанию или аналогичными ...

0 голосов
/ 08 сентября 2011

По умолчанию привязка к параметрам Oracle в хранимой процедуре основана только на позиции.

Это означает, что вы должны добавить свои параметры в том же порядке, в котором они объявлены в процедуре, и Oracle не будет заботиться об имени, для которого вы устанавливаете свой параметр.

Когда вы устанавливаетепривязывая BindByName, вы можете добавлять параметры в любом порядке, если они имеют одинаковые имена.Это, на мой взгляд, намного лучше, чем по умолчанию.

Однако установка BindByName на True или False не повлияет на то, требуется ли параметр или нет.

0 голосов
/ 08 сентября 2011

По моему опыту, BindByName не работает для хранимых процедур - только для запросов.

Но это действительно не должно иметь значения для вас.В любом случае, вы должны вызывать этот SP только из одного метода в вашем приложении.Используйте параметры по умолчанию в сигнатуре этого метода и просто всегда передавайте все параметры в ODP.Net.

object GetFoo(DateTime pubDate, string fName = null, string lName = null, string phone = null)
{

}

Сделайте это, забудьте об этом и используйте свое время для более важных проблем.

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