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范围。