安全的DateTime在T-SQL INSERT语句中

4

最近在使用 DateTime 作为 T-SQL INSERT INTO 语句的一部分时遇到了问题。在一台机器上运行正常,但在另一台机器上可能无法正常工作,我猜测这与本地设置有关。

因此,如果我有一个 DateTime 变量,什么是将其安全地用于 SqlStatement 字符串的方法,以便在任何本地系统设置下都能正常工作?

谢谢

3个回答

9

请使用参数化INSERT查询。

很可能,您的代码正在组装SQL命令字符串。这也使得您的代码容易受到SQL注入攻击。


删除了评论,以为他们在使用TSQL来实现。刚看到asp.net标签时才注意到。 - Martin Smith
另一个问题是SQL DateTime范围比.NET DateTime范围小。 - Oded
1
@MartinSmith 我看到的第一件事是 C# 和 ASP.NET 标签。然后我看到了你的评论,我想:“我是不是搞砸了?” :) - Adriano Carneiro
@Oded 感谢您的提醒。但是您必须同意,最有可能使用参数来解决 OP 的问题。但我现在很好奇,您如何处理这个限制? - Adriano Carneiro
@Adrian - 确实,可能不是OP的问题,但仍然是一个可能存在的问题(比如系统时钟被重置)。如何处理?您必须对日期进行清理-不允许某些日期通过。 - Oded
谢谢Adrian,我不认为范围会对我造成问题,但如果有的话,也许最好将日期时间存储为长整型,而不是日期时间,并在代码后端转换远期日期或更高精度? - StefanE

0

正如Adrian建议的那样,您应该使用参数化查询。

另一个可能性是使用ISO 8601字符串表示,就像这里描述的那样,它独立于区域设置。

它看起来像:

20110921 15:20:00

实际上,仅使用日期时,最安全的格式是YYYYMMDD。如果包括时间,则唯一真正安全的格式是YYYY-MM-DDTHH:MM:SS[...]。 - Aaron Bertrand
@Aaron:MSDN 上说这是 未分隔的 ISO8601。而你的是分隔的 ISO8601。 - Jan
对于输入文字,我觉得这很清楚:http://msdn.microsoft.com/en-us/library/ms190977%28SQL.90%29.aspx 我根本没有看到YYYYMMDD HH:MM:SS。我也没有在ISO 8601中看到你的格式在这里列出:http://msdn.microsoft.com/en-us/library/ms180878.aspx - Aaron Bertrand
@Aaron:我在这个 MSDN 页面上看到了:http://msdn.microsoft.com/zh-cn/library/ms187819.aspx 在你提供的第二个链接中,第1行(只有日期)和第11行(日期和时间)中都提到了。 - Jan
优秀的关于语言中立日期格式的讨论:http://www.karaszi.com/SQLServer/info_datetime.asp。 - Moe Sisko
显示剩余2条评论

0

你可以使用参数化命令/存储过程,在存储过程中创建一个 DateTime 类型的参数,并在调用存储过程时从 .NET 代码中分配它(这样 .NET 和 SQL 将知道它们正在处理日期时间,不会混淆/交换日期和月份),或者你可以在插入命令的顶部包含一个特定的命令,然后使用此模式格式化所有日期时间字符串,例如:

SET DATEFORMAT dmy;

设置日期格式(Transact-SQL)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接