c# - 从本地数据库加载日期到列表中,错误

标签 c#

我有一个包含 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/

相关文章:

c# - 将冗长的字符串(作为参数)传递到控制台应用程序

c# - namespace 是分层的吗?

c# - 如何使用多个 select 语句填充结构

c# - 从字符串映射枚举

c# - AddIfNotNull Dictionary<string, dynamic> 方法

c# - 是否可以在配置中定义一个变量?

c# - 在 Mono : invalid conversion of function? 中将 C++ 公开给 C#

c# - 使用 SQLite 处理数十亿条记录

c# - 让调试器在下一次点击事件时中断

c# - 如何在 EF Core 中插入外键影子属性?