无法更新 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) 可更新视图
无法使用 Python 连接到 MSSQL Server 数据库