使用datetime作为存储过程中的参数更新表时出错

Asw*_*thi 3 .net c# sql-server datetime

将char数据类型转换为DateTime数据类型会导致DateTime值超出范围.该语句已终止.

ALTER PROCEDURE [dbo].[attendance_updatebyemployee_id]
@Employee_id int,
@AtDate datetime,
@FNLogged bit,
@ANLogged bit,
@LogTime varchar(10),
@LogOuttime varchar(10) 

AS
BEGIN   


    SET NOCOUNT ON;    
    update Mst_Attendance set FNLogged=@FNLogged,
    ANLogged=@ANLogged,LogTime=@LogTime,LogOuttime=@LogOuttime 
    where EmployeeId=@Employee_id and Atdate= @AtDate

END
Run Code Online (Sandbox Code Playgroud)

在C#代码我把它作为

 cmd.Parameters.AddWithValue("@AtDate",Dtime.ToString("dd/MMM/yyyy"));
Run Code Online (Sandbox Code Playgroud)

使用SQl profiler时,传递的数据是

exec [dbo].[attendance_updatebyemployee_id] @Employee_id=2,@AtDate='Feb 19 2011 12:00:00:000AM',@FNLogged=1,@ANLogged=0,@LogTime='11:45 AM',@LogOuttime=' ' 
Run Code Online (Sandbox Code Playgroud)

在存储过程中,@ ArcDate具有2011-02-19 00:00:00.000. 从更新命令中断的值.

在表格内,日期保存为 2/19/2011 12:00:00 AM

我该如何解决这个日期问题.

mar*_*c_s 5

从您的代码中,DateTime您的C#代码中似乎有一个变量 - 所以只需按原样使用 - 完全不需要转换为字符串!!

如果你有:

ALTER PROCEDURE [dbo].[attendance_updatebyemployee_id]
  @Employee_id int,
  @AtDate datetime,
.....
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样存储这个:

cmd.Parameters.AddWithValue("@AtDate", Dtime);
Run Code Online (Sandbox Code Playgroud)

假设DtimeDateTimeC#中的类型.

不要不必要地转换和投射东西!这只会引入潜在的破损和转换错误!只需按DateTime原样使用- 它将被发送到SQL Server并DATETIME在T-SQL中使用和识别.

如果你真的需要将日期值转换为字符串以将其传递给SQL Server,我总是建议使用ISO-8601标准格式:YYYYMMDD或者yyyy-MM-ddThh:mm:ss无论是否有任何区域,语言或区域设置,它都可以识别并工作.

所以,如果你绝对必须,那么使用:

Dtime.ToString("yyyyMMdd")
Run Code Online (Sandbox Code Playgroud)

要么

Dtime.ToString("yyyyMMddTHH:mm:ss")
Run Code Online (Sandbox Code Playgroud)

没有别的(所有其他格式都依赖于语言和设置,可能在一种情况下有效,在另一种情况下有效; ISO-8601 始终有效)