Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# T-SQL INSERT语句中的安全日期时间_C#_Asp.net_Sql_Sql Server_Tsql - Fatal编程技术网

C# T-SQL INSERT语句中的安全日期时间

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字符串表示法,如所述,它独立于语言环境设

最近在T-SQL INSERT INTO语句中使用DateTime时遇到问题。在一台机器上可以正常工作,但在另一台机器上可能无法工作,我想这与语言环境设置有关

那么,如果我有DateTime变量,那么在SqlStatement字符串中使用它的安全方法是什么,它将始终工作,而不管本地系统设置如何

谢谢

使用
插入
查询


很可能,您的代码正在组装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
,绝对不安全,但未列在您参考的页面上。