字符串未被识别为有效的DateTime,存储过程空参数

时间:2018-01-01 07:31:07

标签: c# sql-server linq stored-procedures is-empty

我在SQL Server中编写了一个存储过程。我有smalldatetime类型的参数。我想用LINQ运行它时将此参数发送为空白。当我想发送它时,我收到了这个错误。

  

字符串未被识别为有效的DateTime。

如何将日期格式发送空白?

C#,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

1 个答案:

答案 0 :(得分:0)

起初,我认为您需要更改存储过程 现在我再次阅读了这个问题,我意识到错误信息来自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