我有这些代码块:
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
有人可以建议这些代码行有什么问题吗?
答案 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
的值。
如果失败,您应该使用调试器来验证dtFrom
和dtTo
中包含的值。
SqlConnection
语句包装SqlCommand
和using
个对象。