c# - 在存储过程中使用日期时间作为参数更新表时出错

标签 c# .net 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

在 C# 代码中,我将其定义为

 cmd.Parameters.AddWithValue("@AtDate",Dtime.ToString("dd/MMM/yyyy"));

在使用 SQl 分析器时。传递的数据是

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=' ' 

在存储过程中,@AtDate 的值为 2011-02-19 00:00:00.000。 它正在中断更新命令。

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

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

最佳答案

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

如果你有:

ALTER PROCEDURE [dbo].[attendance_updatebyemployee_id]
  @Employee_id int,
  @AtDate datetime,
.....

然后你可以这样调用它:

cmd.Parameters.AddWithValue("@AtDate", Dtime);

假设 Dtime 是 C# 中的 DateTime 类型。

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

如果您确实需要将日期值转换为字符串以将其传递给 SQL Server,我始终建议使用 ISO-8601 标准格式:YYYYMMDDyyyy-MM-ddThh:mm:ss,无论区域、语言或区域设置如何,它都可以被识别和工作。

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

Dtime.ToString("yyyyMMdd")

Dtime.ToString("yyyyMMddTHH:mm:ss")

仅此而已(所有其他格式都取决于语言和设置,并且可能在一种情况下有效,在另一种情况下中断;ISO-8601 始终有效)

关于c# - 在存储过程中使用日期时间作为参数更新表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5049173/

相关文章:

c# - 出现错误 : CS1061

c# - 如何将 dd/mm/yyyy 转换为 dd/mm/yyyy

c# - FluentValidation.AspNetCore 不适用于 Web API 项目

c# - 检查文件夹中的文件

sql-server - 如何在sql server中添加具有自动增量的主键列

c# - Winforms - 在执行长时间运行的同步请求期间如何保持窗口完全绘制/响应?

c# - 将控制台应用程序编译为 32 位

c# - 如何在 .NET Core MVC 项目中转换 appsettings.json?

c# - 如何在 C# 中恢复 SQL Server 2012 数据库 .bak 文件?

SQL Server 2012 从 SQL 查询创建用户