为什么这个SqlCommand参数会产生SQLDateTime溢出错误?

时间:2012-01-06 06:16:31

标签: 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 + "%'";
//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);

最终查询输出(在字符中找到)

SELECT * FROM linkDb Where CreateDt BETWEEN @dt1 AND @dt2

有人可以建议这些代码行有什么问题吗?

2 个答案:

答案 0 :(得分:2)

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

此外,构建这样的SQL字符串非常容易引入SQL。你应该考虑很快放弃这种做法。就像,现在。

答案 1 :(得分:1)

而不是:

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的值。

如果失败,您应该使用调试器来验证dtFromdtTo中包含的值。

顺便说一句,我知道这不是你问题的一部分,但你发布的代码很容易被SQL注入。您还应该使用SqlConnection语句包装SqlCommandusing个对象。