代码之家  ›  专栏  ›  技术社区  ›  unluleyla

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

  •  0
  • unluleyla  · 技术社区  · 8 年前

    我在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 回复  |  直到 8 年前
        1
  •  0
  •   Zohar Peled    8 年前

    起初,我认为您需要更改存储过程。
    现在我再次阅读了这个问题,我意识到错误消息来自c端,而不是存储过程(我仍然认为您应该更改)。

    正在尝试将null或空字符串转换为 DateTime 将导致您的问题出现错误。为了避免这种情况,您需要确保字符串实际上可以转换为 日期时间 在将其发送到存储过程之前:

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

    这样,您将发送 null 如果字符串不能解析为 日期时间 ,并避免错误。

    至于存储过程,我建议改为这样编写:

    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