Строка не была распознана как допустимый DateTime, пустой параметр хранимой процедуры

Я написал хранимую процедуру в SQL Server. У меня есть параметр типа smalldatetime. Я хочу отправить этот параметр пустым, когда запускаю его с помощью LINQ. Когда я хочу отправить его, я получаю эту ошибку.

Строка не была распознана как допустимый DateTime.

Как я могу отправить пустой формат даты?

С#, LINQ;

  var query = ctx.onayListele(Convert.ToDateTime(dataList.olusturulmaTarihi)).ToList();

SQL:

ALTER PROCEDURE [dbo].[onayListele]
    @in_olusturmaTarihi smalldatetime = NULL
AS
BEGIN
    SELECT 
        Onay.onayID, alep.olusturulmaTarihi, TalepTuru.talepTuruAdi, 
        TalepDurumu.talepDurumuAciklamasi 
    FROM 
        Onay 
    WHERE
        (@var_olusturmaTarihi IS NULL OR 
         CONVERT(DATE, Talep.olusturulmaTarihi) = CONVERT(DATE, @var_olusturmaTarihi))
END

person unluleyla    schedule 01.01.2018    source источник
comment
Если бы вы просто запустили DateTime dt = Convert.ToDateTime(dataList.olusturulmaTarihi); это вызывает ту же ошибку? Если это так, вам нужно выяснить, почему это значение не рассматривается как допустимое DateTime.   -  person SoronelHaetir    schedule 01.01.2018
comment
Поскольку dataList.collection отправляется как dataList.olusturulmaTarihi = . И я не знаю, как отправить пустой параметр datetime?   -  person unluleyla    schedule 01.01.2018
comment
Возможный дубликат хранимой процедуры вызова с нулевым значением параметра с EntityFramework   -  person pmcilreavy    schedule 01.01.2018
comment
Все, что вам нужно сделать, это изменить тип данных @in_olusturmaTarihi на Date и удалить его преобразование в хранимой процедуре.   -  person Zohar Peled    schedule 01.01.2018


Ответы (1)


Сначала я подумал, что вам нужно изменить хранимую процедуру.
Теперь, когда я снова прочитал вопрос, я понял, что сообщение об ошибке исходит от стороны C #, а не от хранимой процедуры (я все еще думаю, что надо поменять).

Попытка преобразовать нулевую или пустую строку в DateTime приведет к ошибке в вашем вопросе. Чтобы избежать этого, вам нужно убедиться, что строка действительно может быть преобразована в DateTime, прежде чем отправлять ее в хранимую процедуру:

DateTime datetime;
DateTime? olusturulmaTarihi = null;
if(DateTime.TryParse(dataList.olusturulmaTarihi, out datetime))
{
    olusturulmaTarihi = (DateTime?)datetime;
}
var query = ctx.onayListele(olusturulmaTarihi).ToList();

Таким образом, вы отправите null в хранимую процедуру, если строка не может быть проанализирована как DateTime, и избежите ошибки.

Что касается хранимой процедуры, я бы предложил написать ее так:

ALTER PROCEDURE [dbo].[onayListele]
    @in_olusturmaTarihi date = NULL
AS
BEGIN
   SELECT  Onay.onayID, 
           alep.olusturulmaTarihi, 
           TalepTuru.talepTuruAdi, 
           TalepDurumu.talepDurumuAciklamasi 
   FROM Onay 
   WHERE @var_olusturmaTarihi IS NULL 
   OR CONVERT(date,Talep.olusturulmaTarihi) = @var_olusturmaTarihi
END

Обратите внимание, что если у вас есть индекс Talep.olusturulmaTarihi, эта хранимая процедура не сможет его использовать. В этом случае вам лучше использовать что-то вроде этого:

ALTER PROCEDURE [dbo].[onayListele]
    @in_olusturmaTarihi date = NULL
AS
BEGIN
   SELECT  Onay.onayID, 
           alep.olusturulmaTarihi, 
           TalepTuru.talepTuruAdi, 
           TalepDurumu.talepDurumuAciklamasi 
   FROM Onay 
   WHERE @var_olusturmaTarihi IS NULL 
   OR 
   (
       Talep.olusturulmaTarihi >= CAST(@var_olusturmaTarihi as datetime) -- or whatever the data type of the column is
       AND Talep.olusturulmaTarihi < DATEADD(DAY, 1, CAST(@var_olusturmaTarihi as datetime)) -- or whatever the data type of the column is
   )
END
person Zohar Peled    schedule 01.01.2018