我有一个包含 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 数据类型导致值超出范围”
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 attacks 的影响。 .
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
当天或之后以及 @yearAgo
当天或之前创建的每条记录。这就像要求每个大于或等于 10 并且小于或等于 5 的数字;任何大于或等于 10 的数字都不能小于或等于 5。您需要翻转查询中的 @today
和 @yearAgo
参数。
“从测量中选择*,其中日期时间在@yearAgo 和@today 之间”
关于c# - 从本地数据库加载日期到列表中,错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59182764/