我有2列的本地数据库。一种是整数数据类型,另一种是日期时间数据类型。
我可以使用以下代码将数据成功加载到数据库中:
dataIn = myPort.ReadLine();
dt = DateTime.Now;
dbConnection.Open();
using (var insertCmd = new SqlCommand(@"INSERT INTO Measurements (Distance,DateTime) VALUES (@Distance,@DateTime)", dbConnection))
{
insertCmd.Parameters.Add("@Distance", SqlDbType.VarChar).Value = dataIn;
insertCmd.Parameters.Add("@DateTime", SqlDbType.DateTime).Value = dt;
insertCmd.ExecuteNonQuery();
}
dbConnection.Close();
但是,当运行下面的代码时,选择一些数据并将其添加到列表中时,出现以下错误。
“将varchar数据类型转换为日期时间数据类型导致超出范围的值”
DateTime today = DateTime.Now;
DateTime yearAgo = DateTime.Now.AddYears(-1);
DateTime sdate = new DateTime();
SqlDataReader reader;
List<DateTime> dates = new List<DateTime>();
SqlCommand selectCmd = new SqlCommand("SELECT * FROM Measurements where DateTime between '" + today + "' And '" + yearAgo + "'", dbConnection);
dbConnection.Open();
reader = selectCmd.ExecuteReader();
while (reader.Read())
{
sdate = reader.GetDateTime(reader.GetOrdinal("DateTime"));
dates.Add(sdate);
textBox1.AppendText(sdate.ToString());
}
reader.Close();
dbConnection.Close();
正如评论中提到的那样,您不应使用字符串连接来构建选择查询。您应该使用参数化查询,就像插入时一样。这不仅可以消除可能导致您所看到的异常的格式问题,还可以保护您免受SQL Injection攻击。
DateTime today = DateTime.Now;
DateTime yearAgo = DateTime.Now.AddYears(-1);
DateTime sdate = new DateTime();
SqlDataReader reader;
List<DateTime> dates = new List<DateTime>();
SqlCommand selectCmd = new SqlCommand("SELECT * FROM Measurements where DateTime betweeen @today AND @yearAgo", dbConnection);
dbConnection.Open();
selectCmd.Parameters.AddWithValue("today", today);
selectCmd.Parameters.AddWithValue("yearAgo", yearAgo);
reader = selectCmd.ExecuteReader();
while (reader.Read())
{
sdate = reader.GetDateTime(reader.GetOrdinal("DateTime"));
dates.Add(sdate);
textBox1.AppendText(sdate.ToString());
}
reader.Close();
dbConnection.Close();
附带说明,您编写的查询将永远不会返回结果。您要求在@today
AND或之前或之后创建的每个记录@yearAgo
。这就像要求每个大于或等于10且小于或等于5的数字一样;任何大于或等于10的数字都不能小于或等于5。您需要翻转查询中的@today
和@yearAgo
参数。
"SELECT * FROM Measurements where DateTime between @yearAgo and @today"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句