2012-01-06 86 views
0

我有这些代码块:为什么此SqlCommand参数会产生SQLDateTime溢出错误?

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 overflow.

两个块是通过处理:

DataTable Table = new DataTable(); 
adapter.FillSchema(Table, SchemaType.Source); 
adapter.Fill(Table); 

最后的查询输出(字符中发现)

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

能有人建议什么是错用这些代码行?

+0

显然不是,请检查我提供的代码块..我把一条评论线显示输入样本.. – rofans91 2012-01-06 06:23:38

+0

我已经这样做了。 TQ。事实上,我有其他朋友也帮我检查代码..它不是从输入.. – rofans91 2012-01-06 06:29:18

+0

你能告诉我“参数[我]”这是什么? – 2012-01-06 06:33:30

回答

2

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

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

+0

我知道。但请务必检查我的问题,我提供了输入示例...它位于正常时间线之间.. //他们看起来像这样:2012年2月1日上午12:00:00该错误看起来形成对比我的输入,这就是为什么... – rofans91 2012-01-06 06:25:36

+1

由于marc_s已经说过:_check your assumptions_。我学到的一件事是,当现实与你的期望相冲突时,现实通常是正确的。 – 2012-01-06 06:28:26

+1

已经这样做.. tq ..我不会问这里,如果事情是那么简单肯定.. – rofans91 2012-01-06 06:30:58

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注入。您还应该用using声明包装您的SqlConnectionSqlCommand对象。

+0

针对SQL注入警报的+1 – Simon 2012-01-07 09:58:27

相关问题