Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 C# и необязательные параметры в хранимой процедуре  [new]
=Сергей=
Member

Откуда:
Сообщений: 329
Возникла необходимость определять обязательность параметров в хранимой процедуре.
На C# это делается так:
SqlCommand cmd = newSqlCommand("myProc", connection);
cmd.CommandType = CommandType.StoredProcedure;
SqlCommandBuilder.DeriveParameters(cmd);
foreach (SqlParameter param in cmd.Parameters)
      if (param.IsNullable)
            MessageBox.Show("Nullable!");

Хранимая процедура у меня оформлена так:
CREATE PROCEDURE myProc
      @beg datetime = null,
      @end datetime = null,
      @value varchar(255)
as
begin
...
end

При этом все значения в param.IsNullable равны false.
Как нужно переоформить процедуру, чтоб параметры действительно были nullable?
28 ноя 13, 10:36    [15203828]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
=Сергей=
Member

Откуда:
Сообщений: 329
Дополню вопрос.
Как определить, предусмотрено ли дефолтное значение параметра хранимой процедуры?
28 ноя 13, 10:47    [15203914]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
=Сергей=
При этом все значения в param.IsNullable равны false.
А посмотрите, эти джанные вообще у сервера запрашиваются?

По идее все параметры любой процедуры должны быть param.IsNullable = true, ведь сиквел всегда допускает null для любого параметра, кроме табличного типа
28 ноя 13, 10:49    [15203940]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
=Сергей=
Как определить, предусмотрено ли дефолтное значение параметра хранимой процедуры?
Такого стандартно не продусмотрено, но впрочем, посмотрите, получает ли прога это значение, как я писал выше
28 ноя 13, 10:51    [15203956]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
=Сергей=
Member

Откуда:
Сообщений: 329
[quot alexeyvg]
=Сергей=
По идее все параметры любой процедуры должны быть param.IsNullable = true, ведь сиквел всегда допускает null для любого параметра, кроме табличного типа

При переборе ВСЕХ параметров, для всех IsNullable идет false

Есть соображения, как узнать средствами SQL, предусмотрено дефолтное значение или нет?
Пытаюсь парсить
SELECT text FROM syscomments WHERE id = object_id('myProc') and colid=1

но решение кажется мне кривым.
28 ноя 13, 11:04    [15204055]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
=Сергей=
Есть соображения, как узнать средствами SQL, предусмотрено дефолтное значение или нет?
Пытаюсь парсить
SELECT text FROM syscomments WHERE id = object_id('myProc') and colid=1


но решение кажется мне кривым.
Ну в общем да, нужно использовать таблицу параметров: sys.parameters
Там есть поле has_default_value
28 ноя 13, 11:17    [15204173]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
alexeyvg
=Сергей=
Есть соображения, как узнать средствами SQL, предусмотрено дефолтное значение или нет?
Пытаюсь парсить
SELECT text FROM syscomments WHERE id = object_id('myProc') and colid=1



но решение кажется мне кривым.
Ну в общем да, нужно использовать таблицу параметров: sys.parameters
Там есть поле has_default_value
Правда, это поле не показывает реальность :-)
28 ноя 13, 11:19    [15204207]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
=Сергей=
Пытаюсь парсить
Получается, это единственный способ.
28 ноя 13, 11:22    [15204240]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
=Сергей=
Member

Откуда:
Сообщений: 329
alexeyvg
Правда, это поле не показывает реальность :-)

Согласен :-)
буду парсить - адский гемор!
28 ноя 13, 11:24    [15204255]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
=Сергей=
буду парсить


Зачем?
28 ноя 13, 11:39    [15204423]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
=Сергей=
Возникла необходимость определять обязательность параметров в хранимой процедуре.
На C# это делается так:
SqlCommand cmd = newSqlCommand("myProc", connection);
cmd.CommandType = CommandType.StoredProcedure;
SqlCommandBuilder.DeriveParameters(cmd);
foreach (SqlParameter param in cmd.Parameters)
      if (param.IsNullable)
            MessageBox.Show("Nullable!");

Читать (внимательно) документацию пробовали?
SqlParameter.IsNullable Property
Gets or sets a value that indicates whether the parameter accepts null values. IsNullable is not used to validate the parameter’s value and will not prevent sending or receiving a null value when executing a command.
Никакого отношения к "дефолтности" это свойство не имеет.
=Сергей=
Хранимая процедура у меня оформлена так:
CREATE PROCEDURE myProc
      @beg datetime = null,
      @end datetime = null,
      @value varchar(255)
as
begin
...
end

При этом все значения в param.IsNullable равны false.
Как нужно переоформить процедуру, чтоб параметры действительно были nullable?
Во-первых, что Вы будете делать, когда дефолтное значение параметра будет не NULL?
И во-вторых, сов.случайно не подскажете, где Вы в SqlParameter видели атрибут, эквивалентный дефолтному значению?
28 ноя 13, 11:40    [15204435]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
sphinx_mv
Во-первых, что Вы будете делать, когда дефолтное значение параметра будет не NULL?
И во-вторых, сов.случайно не подскажете, где Вы в SqlParameter видели атрибут, эквивалентный дефолтному значению?
В принципе ТС и хочет получить дефаултные значения для параметров, понятно, что может быть не NULL, и в SqlParameter такого нет.

Я правда не понимаю, зачем это нужно, что с этими значениями можно потом будет сделать???
28 ноя 13, 12:52    [15205257]     Ответить | Цитировать Сообщить модератору
 Re: C# и необязательные параметры в хранимой процедуре  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
Невозможно это. В свойствах SqlParameter ничего соотвествующего нет, в sys.parameters поле has_default_value поддерживается только для CLR процедур, касательно же обычных - msdn даёт ценный совет:
To view the default value of a parameter in a Transact-SQL object, query the definition column of the sys.sql_modules catalog view, or use the OBJECT_DEFINITION system function.

Соответственно, если порыться на codeproject (например), то можно найти вот такие решения, основанные на парсинге текста (что, разумеется, не будет работать в случае закриптованной процедуры).
28 ноя 13, 15:55    [15206834]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить