Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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/3/sockets/2.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# 为什么此SqlCommand参数会产生SQLDateTime溢出错误?_C#_Sql Server - Fatal编程技术网

C# 为什么此SqlCommand参数会产生SQLDateTime溢出错误?

C# 为什么此SqlCommand参数会产生SQLDateTime溢出错误?,c#,sql-server,C#,Sql Server,我有以下代码块: var cmd = new SqlCommand (); cmd.CommandText = @"SELECT * FROM " + TableName + " Where "; SqlConnection a = new SqlConnection("the setting"); cmd.Connection = a; 下面这些行可以很好地工作: cmd.CommandText += strFromTextBox + " LIKE '%" + strUserInput +

我有以下代码块:

var cmd = new SqlCommand (); 
cmd.CommandText = @"SELECT * FROM " + TableName + " Where ";
SqlConnection a = new SqlConnection("the setting");
cmd.Connection = a;
下面这些行可以很好地工作:

cmd.CommandText += strFromTextBox + " LIKE '%" + strUserInput + "%'";
//strFromTextBox & strUserInput is string datatype
//it looks like 'apple', 'ladder', just normal string
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;
但这些都产生了错误:

DateTime dtFrom = DateTime.Parse(dt1).Date;
DateTime dtTo = DateTime.Parse(dt2).Date;
//dt1 & dt2 is originally a string
//they look something like this: 2/1/2012 12:00:00 AM
cmd.Parameters.AddWithValue("@dt1", @dtFrom); 
cmd.Parameters.AddWithValue("@dt2", @dtTo);
cmd.CommandText+= parameter[i].ToString() + " BETWEEN @dt1 AND @dt2";
//parameter[i] refers to the column name
它产生的错误是:

System.Data.SqlTypes.SqlTypeException:SqlDateTime溢出

这两个块都通过以下方式处理:

DataTable Table = new DataTable();
adapter.FillSchema(Table, SchemaType.Source);
adapter.Fill(Table);
最终查询输出(在字符转换期间找到)


有人能告诉我这些代码行有什么问题吗?

SQL Server日期时间数据类型只能表示从1753年1月1日00:00:00到1999年12月31日23:59:59的日期。我的猜测是,其中一个日期字符串要么被赋予了一个超出此范围的日期,要么被解析的方式与您想象的不同


此外,构建这样的SQL字符串非常容易被SQL注入。你应该考虑很快放弃这个练习。就像现在一样。

SQL Server日期时间数据类型只能表示从1753年1月1日00:00:00到1999年12月31日23:59:59的日期。我的猜测是,其中一个日期字符串要么被赋予了一个超出此范围的日期,要么被解析的方式与您想象的不同

此外,构建这样的SQL字符串非常容易被SQL注入。你应该考虑很快放弃这个练习。就像现在一样。

而不是这个:

cmd.Parameters.AddWithValue("@dt1", @dtFrom); 
cmd.Parameters.AddWithValue("@dt2", @dtTo);
试试这个:

SqlParameterCollection p = cmd.Parameters;
p.Add("@dt1", SqlDbType.DateTime).Value = dtFrom;
p.Add("@dt2", SqlDbType.DateTime).Value = dtTo;
在设置参数之前,我还会设置
CommandText
的值

如果同样失败,则应使用调试器验证
dtFrom
dtTo
中包含的值

顺便说一句,我知道这不是你问题的一部分,但是你发布的代码容易受到SQL注入的影响。您还应该使用
语句将
SqlConnection
SqlCommand
对象包装为

而不是:

cmd.Parameters.AddWithValue("@dt1", @dtFrom); 
cmd.Parameters.AddWithValue("@dt2", @dtTo);
试试这个:

SqlParameterCollection p = cmd.Parameters;
p.Add("@dt1", SqlDbType.DateTime).Value = dtFrom;
p.Add("@dt2", SqlDbType.DateTime).Value = dtTo;
在设置参数之前,我还会设置
CommandText
的值

如果同样失败,则应使用调试器验证
dtFrom
dtTo
中包含的值


顺便说一句,我知道这不是你问题的一部分,但是你发布的代码容易受到SQL注入的影响。您还应该使用
using
语句将
SqlConnection
SqlCommand
对象包装起来。

显然不是,请检查我提供的代码块。。我放了一行注释来显示输入的样本..我已经这样做了。TQ。事实上,我还有其他朋友帮我检查代码。。不是输入的..你能告诉我“参数[i]”是什么吗?它指的是列名,我已经编辑过了。。谢谢你发现它。@marc_我编辑了我的问题,不能放在这里,因为在评论中输入的符号和字符不能超过1。。显然不能,请检查我提供的代码块。。我放了一行注释来显示输入的样本..我已经这样做了。TQ。事实上,我还有其他朋友帮我检查代码。。不是输入的..你能告诉我“参数[i]”是什么吗?它指的是列名,我已经编辑过了。。谢谢你发现它。@marc_我编辑了我的问题,不能放在这里,因为在评论中输入的符号和字符不能超过1。。我知道。但请仔细检查我的问题,我确实提供了输入的示例。。。位于正常时间线之间//它们看起来是这样的:2012年2月1日12:00:00上午错误看起来与我的输入形成对比这就是为什么…正如marc_已经说过的:检查你的假设。我学到的是,当现实与您的期望发生冲突时,现实通常是正确的。除非SQL server或.net基类库中存在错误(这对于数百万人来说是非常不可能的),否则输入中存在错误,日期字符串为null或为空,导致DateTime.MinValue超出SQL范围。我知道。但请仔细检查我的问题,我确实提供了输入的示例。。。位于正常时间线之间//它们看起来是这样的:2012年2月1日12:00:00上午错误看起来与我的输入形成对比这就是为什么…正如marc_已经说过的:检查你的假设。我学到的是,当现实与您的期望发生冲突时,现实通常是正确的。除非SQL server或.net基类库中存在错误(这对于数百万人来说是非常不可能的),否则输入中存在错误,日期字符串为null或空,导致DateTime.MinValue超出SQL范围。