无法更新 MSSQL Server 中的 DateTime 字段

Posted

技术标签:

【中文标题】无法更新 MSSQL Server 中的 DateTime 字段【英文标题】:Cannot update DateTime field in MSSQL Server 【发布时间】:2019-09-18 02:10:05 【问题描述】:

我的 ASP.NET MVC 项目中有一个更新子句,我只想使用当前时间更新单个字段。我知道我也可以使用 GETDATE(),但我需要从服务层传递日期参数。因此,查询完全如下所示,我也尝试在 MSSQL Server 上使用它,但遇到同样的错误:“Incorrect syntax near '.2019'.”

UPDATE com.[Ticket] SET Updated = 29.04.2019 15:25:58 WHERE [Id] = 103

这是我构建 sql 子句的代码端:

DateTime lastUpdate = DateTime.Now;
string sql = "UPDATE com.[Ticket] SET Updated = " + lastUpdate + " WHERE [Id] = " + model.Id;

更新的字段是 n 日期时间类型。我必须在更新子句中格式化日期参数吗?

【问题讨论】:

您显然是在查询中替换文本值。不要那样做。阅读如何使用正确类型的参数。你避免了这个问题,作为一个重要的好处,你还避免了 SQL 注入。 如果以某种方式传递值,请使用变量类型,因此在放入查询时会正确键入。 '2019-04-29 15:25:58' 并且由于您使用的是查询,因此只需传递一个日期时间参数 dotnetperls.com/sqlparameter 如果您不想编写样板代码,请使用SqlCommand 及其Parameters 属性,或者类似Dapper 的东西。通常,您不希望通过连接文本来创建查询,即使您传递的是“安全”常量;这会导致计划缓存污染。 【参考方案1】:

参数化您的查询。这样你就不用担心日期字符串的格式,更重要的是,你不会对 SQL 注入持开放态度。

string sql = "UPDATE com.[Ticket] SET Updated = @date WHERE [Id] = @id";
SqlCommand command = new SqlCommand(sql, conn);
command.Parameters.AddWithValue("@date", DateTime.Now);
command.Parameters.AddWithValue("@id", model.Id);

【讨论】:

避免AddWithValue,提供正确的类型。 赞成,但您真的应该阅读 Jeroen 提供的链接并停止使用 AddWithValue【参考方案2】:

日期可以格式化:

UPDATE com.[Ticket] SET Updated = '2019/04/29 15:25:58' WHERE [Id] = 103

【讨论】:

这不是日期/时间文字的safe formats 之一,并且不应使用它,即使您热衷于将查询作为原始文本提供(在这种情况下不合适) .

以上是关于无法更新 MSSQL Server 中的 DateTime 字段的主要内容,如果未能解决你的问题,请参考以下文章

mssql sql server 系统更新,如何正确的增加表字段

具有多个基表和完整性能的 Microsoft SQL Server (MSSQL) 可更新视图

node mssql 无法连接sql server

无法使用 Python 连接到 MSSQL Server 数据库

无法在 Windows 上从 Python 连接到 MSSQL Server

SQL安装出错啊!! 对于MSSQL server服务,服务控制操作失败:267目录名无效