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

Откуда: Израиль. Хадера.
Сообщений: 198
В таблице есть поле типа SmallDateTime в котором Allow Null разрешено.

В Stored Procedure определен параметр:
@DateOpen SmallDateTime = Null

Однако, при попытке запустить эту процедуру (из кода C#) не передавая в параметр значения, я получаю сообщение об ошибке, что параметр обязан быть определен в промежутке между 1793 годом и 9999-м.

Но мне не подходит 1793 год. Иногда мне нужен именно Null.
Как это сделать, не изменяя типа SmallDateTime на что нибудь другое?



Спасибо!
Евгений Боуден
22 июл 09, 14:34    [7445546]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Дата и время (Transact-SQL)
SmallDateTime, вообще-то, имеет несколько другой диапазон допустимых значений
Вы чего-то не договариваете...
22 июл 09, 14:37    [7445577]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36817
Показывайте текст процедуры и текст команды, которую ваш код на C# отправляет на сервер.
22 июл 09, 14:39    [7445586]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Glory
Member

Откуда:
Сообщений: 104760
evgenybe


Однако, при попытке запустить эту процедуру (из кода C#) не передавая в параметр значения,


Сообщение сервера как раз говорит, что параметер как раз серверу передается
22 июл 09, 14:50    [7445674]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Паганель
Дата и время (Transact-SQL)
SmallDateTime, вообще-то, имеет несколько другой диапазон допустимых значений
Вы чего-то не договариваете...


Извиняюсь: вот точное сообщение об ошибке:
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
22 июл 09, 14:53    [7445708]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
SqlDateTime - это такой объект в .Net, я правильно понял?
Тогда по поводу евонного overflow-а Вам в форум по C#
имхо, конечно
22 июл 09, 14:58    [7445750]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Гавриленко Сергей Алексеевич
Показывайте текст процедуры и текст команды, которую ваш код на C# отправляет на сервер.


Вот текст С# public void SaveCommonDetails()
{
clsDS oDS = new clsDS();
SqlCommand cmd = new SqlCommand();
cmd.Connection = oDS.GetSqlConn(true);

cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "spSaveInvFolderCommonDetails";

cmd.Parameters.Add("@InvFolderID", System.Data.SqlDbType.Int);
cmd.Parameters["@InvFolderID"].Value = mInvFolderID;

cmd.Parameters.Add("@DateFolderOpen", System.Data.SqlDbType.SmallDateTime);
cmd.Parameters["@DateFolderOpen"].Value = mDateFolderOpen;

cmd.Parameters.Add("@SecOfficerID", System.Data.SqlDbType.Int);
cmd.Parameters["@SecOfficerID"].Value = mSecOfficerID;

cmd.Parameters.Add("@Sensitive", System.Data.SqlDbType.Int);
cmd.Parameters["@Sensitive"].Value = mSensitive;

cmd.Parameters.Add("@OffenceTypeID", System.Data.SqlDbType.Int);
cmd.Parameters["@OffenceTypeID"].Value = mOffenceTypeID;

cmd.Parameters.Add("@FolderStatusID", System.Data.SqlDbType.Int);
cmd.Parameters["@FolderStatusID"].Value = mFolderStatusID;

cmd.Parameters.Add("@DateEvent", System.Data.SqlDbType.SmallDateTime);
cmd.Parameters["@DateEvent"].Value = mDateEvent;

cmd.Parameters.Add("@EventTime", System.Data.SqlDbType.NVarChar, 5);
cmd.Parameters["@EventTime"].Value = mEventTime;

cmd.Parameters.Add("@DetectedDate", System.Data.SqlDbType.SmallDateTime);
try
{
cmd.Parameters["@DetectedDate"].Value = mDetectedDate;
}
catch (Exception)
{}


cmd.Parameters.Add("@DetectedTime", System.Data.SqlDbType.NVarChar, 5);
cmd.Parameters["@DetectedTime"].Value = mDetectedTime;

cmd.Parameters.Add("@EventDescr", System.Data.SqlDbType.NVarChar, 100);
cmd.Parameters["@EventDescr"].Value = mEventDescr;

cmd.Parameters.Add("@ShortDescr", System.Data.SqlDbType.NVarChar, 100);
cmd.Parameters["@ShortDescr"].Value = mShortDescr;

cmd.Parameters.Add("@FoldComment", System.Data.SqlDbType.NVarChar, 100);
cmd.Parameters["@FoldComment"].Value = mFoldComment;

cmd.Parameters.Add("@InvResultID", System.Data.SqlDbType.Int);
cmd.Parameters["@InvResultID"].Value = mInvResultID;


try
{
//cmd.ExecuteScalar();
mInvFolderID = int.Parse(cmd.ExecuteScalar().ToString());

cmd.CommandText = "spInvDeleteFolderThemes";
cmd.Parameters.Clear();
cmd.Parameters.Add("@InvFolderID", System.Data.SqlDbType.Int);
cmd.Parameters["@InvFolderID"].Value = mInvFolderID;

cmd.ExecuteNonQuery();

А это текст Stored Procedure (часть):
ALTER PROCEDURE dbo.spSaveInvFolderCommonDetails
(
@InvFolderID Int = Null,
@DateFolderOpen DateTime,
@SecOfficerID Int,
@Sensitive Int,
@OffenceTypeID Int,
@FolderStatusID Int,
@DateEvent DateTime,
@EventTime NVarChar(5),
@DetectedDate DateTime = null,
@DetectedTime NVarchar(5),
@EventDescr NVarChar(100),
@ShortDescr NVarchar(30),
@FoldComment NVarChar(100),
@InvResultID Int
)
AS

if (@InvFolderID IS Null) OR (@InvFolderID = 0)
Begin
INSERT INTO InvFolder(
OpenDate
,idMainSite
,FolderSensitiveID
,OffenceTypeID
,FolderStatusID
,EventDate
,EventTime
,DetectedDate
,DetectedTime
,EventDescr
,ShortDescr
,Comment
,UpdateDate
,InvResultID
)
Values(
@DateFolderOpen,
@SecOfficerID,
@Sensitive,
@OffenceTypeID,
@FolderStatusID,
@DateEvent,
@EventTime,
@DetectedDate,
@DetectedTime,
@EventDescr,
@ShortDescr,
@FoldComment,
getdate(),
@InvResultID
)

set @InvFolderID = @@identity

End
22 июл 09, 15:01    [7445783]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Glory
Member

Откуда:
Сообщений: 104760
И это
cmd.Parameters.Add("@DetectedTime", System.Data.SqlDbType.NVarChar, 5);
cmd.Parameters["@DetectedTime"].Value = mDetectedTime;

вы называете "не передавая в параметр значения" ??
22 июл 09, 15:02    [7445794]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
@DateFolderOpen DateTime,

и где тут вы нашли System.Data.SqlDbType.SmallDateTime?
22 июл 09, 15:05    [7445825]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Glory, Вы перепутали похожие названия. Речь идет о DetectedDate, а не о DetectedTime.
22 июл 09, 15:13    [7445893]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Glory
Member

Откуда:
Сообщений: 104760
evgenybe
Glory, Вы перепутали похожие названия. Речь идет о DetectedDate, а не о DetectedTime.

Ну так cmd.Parameters.Add("@DetectedDate", System.Data.SqlDbType.SmallDateTime); все равно присутствует в вашем коде
22 июл 09, 15:15    [7445905]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Konst_One,
Во-первых речь идет о параметре @DetectedDate (выделено красным)
Во-вторых проблема не в том, что я передаю SmallDateTime, а не DateTime. Это проверено неоднократно. Проблема в том, что try...catch.... (выделено красным) при определенных условиях (если пользователь не выбрал дату, что совершенно легитимно) заходит именно в Catch и тогда параметр не принимает значения. И тогда ИЗ БАЗЫ ДАННЫХ я получаю ошибку, несмотря на то, что параметр по умолчанию имеет значение NULL, а в таблице поле определено как Allow Null.
22 июл 09, 15:21    [7445984]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Паганель, сообщение об ошибке я получаю из БАЗЫ ДАННЫХ.
22 июл 09, 15:22    [7445993]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Glory
Member

Откуда:
Сообщений: 104760
evgenybe
Konst_One,
Во-первых речь идет о параметре @DetectedDate (выделено красным)
Во-вторых проблема не в том, что я передаю SmallDateTime, а не DateTime. Это проверено неоднократно. Проблема в том, что try...catch.... (выделено красным) при определенных условиях (если пользователь не выбрал дату, что совершенно легитимно) заходит именно в Catch и тогда параметр не принимает значения. И тогда ИЗ БАЗЫ ДАННЫХ я получаю ошибку, несмотря на то, что параметр по умолчанию имеет значение NULL, а в таблице поле определено как Allow Null.

То, что вы не задали значение для параметра, не означает, что серверу не было отправлено значение
Параметры по-умолчанию для процедур выбираются только
- если в строке вызова нет вообще этого параметра
- если в строке вызова на месте параметра указано ключевое слово default
22 июл 09, 15:25    [7446017]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
if (mDetectedDate == null)
cmd.Parameters["@DetectedDate"].Value = DBNull.Value;
else
cmd.Parameters["@DetectedDate"].Value = mDetectedDate;

примерно так.
22 июл 09, 15:28    [7446050]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Glory

То, что вы не задали значение для параметра, не означает, что серверу не было отправлено значение
Параметры по-умолчанию для процедур выбираются только
- если в строке вызова нет вообще этого параметра
- если в строке вызова на месте параметра указано ключевое слово default


Опсь. Так вот же и вопрос, а как сделать правильно? Так:
cmd.Parameters["@DetectedDate"].Value = mDetectedDate default;
22 июл 09, 15:31    [7446072]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
@DetectedDate DateTime = null,
@DetectedTime NVarchar(5),
@EventDescr NVarChar(100),
@ShortDescr NVarchar(30),
@FoldComment NVarChar(100),
@InvResultID Int


у вас процедура неверно описана. потрудитесь описать значения по-умолчанию для параметров , которые идут после DetectedDate
22 июл 09, 15:35    [7446093]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Glory
Member

Откуда:
Сообщений: 104760
evgenybe
Glory

То, что вы не задали значение для параметра, не означает, что серверу не было отправлено значение
Параметры по-умолчанию для процедур выбираются только
- если в строке вызова нет вообще этого параметра
- если в строке вызова на месте параметра указано ключевое слово default


Опсь. Так вот же и вопрос, а как сделать правильно? Так:
cmd.Parameters["@DetectedDate"].Value = mDetectedDate default;

Нет. Я говорил про текст команды на TSQL. А не о коде на С.
22 июл 09, 15:40    [7446129]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
и ещё:
если вы хотите , чтобы сработали значения по-молчанию для параметров, задланых в описании процедуры, то эти параметры можно просто не объявлять в вызове.

т.е., если у вас DetectedDate = NULL :

cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "spSaveInvFolderCommonDetails";

cmd.Parameters.Add("@InvFolderID", System.Data.SqlDbType.Int);
cmd.Parameters["@InvFolderID"].Value = mInvFolderID;

cmd.Parameters.Add("@DateFolderOpen", System.Data.SqlDbType.SmallDateTime);
cmd.Parameters["@DateFolderOpen"].Value = mDateFolderOpen;

cmd.Parameters.Add("@SecOfficerID", System.Data.SqlDbType.Int);
cmd.Parameters["@SecOfficerID"].Value = mSecOfficerID;

cmd.Parameters.Add("@Sensitive", System.Data.SqlDbType.Int);
cmd.Parameters["@Sensitive"].Value = mSensitive;

cmd.Parameters.Add("@OffenceTypeID", System.Data.SqlDbType.Int);
cmd.Parameters["@OffenceTypeID"].Value = mOffenceTypeID;

cmd.Parameters.Add("@FolderStatusID", System.Data.SqlDbType.Int);
cmd.Parameters["@FolderStatusID"].Value = mFolderStatusID;

cmd.Parameters.Add("@DateEvent", System.Data.SqlDbType.SmallDateTime);
cmd.Parameters["@DateEvent"].Value = mDateEvent;

cmd.Parameters.Add("@EventTime", System.Data.SqlDbType.NVarChar, 5);
cmd.Parameters["@EventTime"].Value = mEventTime;

if (mDetectedDate == null)
  cmd.ExecuteNonQuery();
else
...описываем оставшиеся параметры
22 июл 09, 15:40    [7446135]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Konst_One
@DetectedDate DateTime = null,
@DetectedTime NVarchar(5)='',
@EventDescr NVarChar(100)='',
@ShortDescr NVarchar(30)='',
@FoldComment NVarChar(100)='',
@InvResultID Int=0


у вас процедура неверно описана. потрудитесь описать значения по-умолчанию для параметров , которые идут после DetectedDate

Описал (см выше). Получаю все тоже сообщение о неверном диапазоне даты
22 июл 09, 15:49    [7446193]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Glory
Member

Откуда:
Сообщений: 104760
evgenybe
Konst_One
@DetectedDate DateTime = null,
@DetectedTime NVarchar(5)='',
@EventDescr NVarChar(100)='',
@ShortDescr NVarchar(30)='',
@FoldComment NVarChar(100)='',
@InvResultID Int=0


у вас процедура неверно описана. потрудитесь описать значения по-умолчанию для параметров , которые идут после DetectedDate

Описал (см выше). Получаю все тоже сообщение о неверном диапазоне даты

Ну так посмотрите уже, какая конечная команда передается серверу то ?
22 июл 09, 15:50    [7446212]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
Konst_One
Member

Откуда:
Сообщений: 11515
и мы должны догадаться теперь, как вы сейчас вызываете эту процедуру и допускает ли поле DetectedDate в вашей таблице InvFolder значения NULL?
22 июл 09, 15:54    [7446245]     Ответить | Цитировать Сообщить модератору
 Re: Не запускается StoredProcedure в которой есть параметр типа DateTime  [new]
evgenybe
Member

Откуда: Израиль. Хадера.
Сообщений: 198
Konst_One
и ещё:
если вы хотите , чтобы сработали значения по-молчанию для параметров, задланых в описании процедуры, то эти параметры можно просто не объявлять в вызове.

т.е., если у вас DetectedDate = NULL :

...

if (mDetectedDate == null)
cmd.ExecuteNonQuery();
else
...описываем оставшиеся параметры[/src]


Ага. Понял. Работает. Надо было не только само value не передавать, но и параметр не добавлять в список параметров.
Спасибо!
22 июл 09, 16:00    [7446295]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить