我将日期存储为dd/mm/yy
,我想显示基于日期的记录。我已经编写了以下代码,但未返回正确的结果。我认为查询中存在一些错误。
private void FillDataGrid()
{
con.Open();
var date1 = Convert.ToDateTime(datePicker1.SelectedDate.Value).ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
var date2 = Convert.ToDateTime(datePicker2.SelectedDate.Value).ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);
label4.Content = date1;
label5.Content = date2;
SqlDataAdapter sda = new SqlDataAdapter("Select batch_id, product_name, quantity, left_qty, purchaseDate, manufacturing_date, expiryDate from batch where Convert(varchar, expiryDate, 103) BETWEEN '" + date1 + "' AND '" + date2 + "' ", con);
DataSet ds = new DataSet();
DataTable dt = new DataTable(); // being used to calculate total price
sda.Fill(dt);
sda.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
// Binding the Grid with the Itemsource property
dataGrid1.ItemsSource = ds.Tables[0].DefaultView;
}
con.Close();
}
附加了错误的结果快照Image of Wrong Results
答案 0 :(得分:2)
上一行:
SqlDataAdapter sda = new SqlDataAdapter("Select batch_id,product_name,quantity,left_qty,purchaseDate,manufacturing_date,expiryDate from batch where Convert(varchar,expiryDate,103) BETWEEN '" + date1 + "' AND '" + date2 + "' ", con);
...并将其转换为类似这样的内容:
SqlDataAdapter sda = new SqlDataAdapter("Select batch_id,product_name,quantity,left_qty,purchaseDate,manufacturing_date,expiryDate from batch where Convert(varchar,expiryDate,103) BETWEEN @from AND @to;", con);
sda.SelectCommand.Parameters.AddWthValue("@from", "'" + Convert.ToDateTime(datePicker1.SelectedDate.Value).ToString("yyyyMMdd") + "'");
sda.SelectCommand.Parameters.AddWthValue("@to", "'" + Convert.ToDateTime(datePicker2.SelectedDate.Value).ToString("yyyyMMdd") + "'");
所以我很快用Visual Studio 2017解决方案在SQL Sever 2016数据库中进行了欺骗。我必须删除单引号才能使其正常工作,但我可能对此有些怀疑。这是我实际上最终开始工作的代码:
SqlDataAdapter sda = new SqlDataAdapter("Select batch_id, product_name, quantity, left_qty, purchaseDate, manufacturing_date, expiryDate from batch where CONVERT(DATE, expiryDate, 103) BETWEEN @from AND @to;", con);
sda.SelectCommand.Parameters.AddWithValue("@from", Convert.ToDateTime(datePicker1.Value).ToString("yyyyMMdd"));
sda.SelectCommand.Parameters.AddWithValue("@to", Convert.ToDateTime(datePicker2.Value).ToString("yyyyMMdd"));
请注意,我的日期时间选择器无法与SelectedDate
一起使用,但是您很可能会针对其他版本的.NET等,因此也许您将需要这些。无论如何,这里的关键是:
CONVERT
使用DATE
将文本字符串转换为103
,以使其处理dd / mm / yyyy格式; from
和to
日期,以避免SQL注入等; '
,因为当您使用参数时,这一切对您来说都很好。不过,我同意以上其他评论者的意见;将日期作为文本存储在数据库中是一场灾难,等待发生。这应该会让您有短期的选择,但是我建议您退后一步,在较长期的情况下考虑一下。
最后,这是工作原理的图片,以及背后的代码:
答案 1 :(得分:0)
我已经在@Richard Hansel的帮助下解决了它。现在下面是代码的工作行。
storage
答案 2 :(得分:-1)
尝试在查询中使用如下分隔符(#)。
SqlDataAdapter sda = new SqlDataAdapter("Select batch_id,product_name,quantity,left_qty,purchaseDate,manufacturing_date,expiryDate from batch where Convert(varchar,expiryDate,103) BETWEEN #" + date1 + "# AND #" + date2 + "# ", con);