C# T-SQL INSERT语句中的安全日期时间
最近在T-SQL INSERT INTO语句中使用DateTime时遇到问题。在一台机器上可以正常工作,但在另一台机器上可能无法工作,我想这与语言环境设置有关 那么,如果我有DateTime变量,那么在SqlStatement字符串中使用它的安全方法是什么,它将始终工作,而不管本地系统设置如何 谢谢使用C# T-SQL INSERT语句中的安全日期时间,c#,asp.net,sql,sql-server,tsql,C#,Asp.net,Sql,Sql Server,Tsql,最近在T-SQL INSERT INTO语句中使用DateTime时遇到问题。在一台机器上可以正常工作,但在另一台机器上可能无法工作,我想这与语言环境设置有关 那么,如果我有DateTime变量,那么在SqlStatement字符串中使用它的安全方法是什么,它将始终工作,而不管本地系统设置如何 谢谢使用插入查询 很可能,您的代码正在组装SQL命令字符串。这也使您的代码容易受到攻击。您应该按照Adrian的建议使用参数化查询 另一种可能是使用ISO 8601字符串表示法,如所述,它独立于语言环境设
插入
查询
很可能,您的代码正在组装SQL命令字符串。这也使您的代码容易受到攻击。您应该按照Adrian的建议使用参数化查询 另一种可能是使用ISO 8601字符串表示法,如所述,它独立于语言环境设置 这看起来像:
20110921 15:20:00
或者使用参数化命令/存储过程,在存储中创建DateTime类型的参数,并在调用存储时从.net代码分配它(这样.net和SQL将知道它们使用的是DateTime,并且永远不会混淆/交换日期和月份),或者在insert命令的顶部包含特定命令,然后使用此模式格式化所有dataetime字符串,例如:
SET DATEFORMAT dmy;
删除了评论,以为他们是在TSQL中做的。刚刚注意到asp.net标记。另一个问题是SQL DateTime范围小于.net DateTime范围。@MartinSmith我首先看到的是C#和asp.net标记。然后我看到你的评论,我想“我搞砸了吗?”:@Oded谢谢你的提醒。但您必须同意,使用参数最有可能解决OP的问题。但我现在很好奇,你如何处理这个限制?@Adrian-True,可能不是OP的问题,但仍然是一个可能的问题(比如系统时钟被重置)。如何处理?您必须清理日期-不允许某些日期通过。实际上,对于日期,最安全的格式是YYYYMMDD。如果包括时间,唯一真正安全的格式是YYYY-MM-DDTHH:MM:SS[…]@Aaron:MSDN说这是未分离的ISO8601。您的是独立的ISO8601。对于输入文字,我似乎非常清楚:我根本没有看到这里提到的YYYYMMDD HH:MM:SS。我在这里也没有看到ISO 8601下列出的格式:@Aaron:我在这个msdn页面上读过:在你的第二个链接中,第1行(仅日期)和第11行(随时间日期)中提到了它,我只是更正了你的格式不是ISO 8601。事实上,您的格式是安全的,但从技术上讲,它不是您描述的ISO 8601(ISO 8601和该文档中未分离的是单独的条目)。ISO 8601=
YYYY-MM-DDThh:MM:ss
,unspreated=YYYYMMDD-hh:MM:ss
和ANSI=YYYY-MM-DD-hh:MM:ss
-ANSI不能避免语言差异,但我承认,其他两个是安全的。我建议的格式不是“单独的ISO8601”,而是ISO8601。SQL Server中的“分离”格式为mm/dd/yyyy hh:mm:ss
,绝对不安全,但未列在您参考的页面上。