我有一个非常简单的问题。我的VB.NET表单上有几个datepicker控件,用户选择“startDate”和“endDate”,显示相关表中的所有行,在用户选择的开始日期和结束日期之间有orderDate
。
以下是相关代码:
Private Sub generate_report_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles generate_report.Click
Try
Dim con As New OleDb.OleDbConnection
con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\KHMSDB.accdb"
con.Open()
Dim sql As String
Dim selected As String = ""
Dim ds As DataSet = New DataSet
Dim adapter As New OleDb.OleDbDataAdapter
sql = "SELECT OrderDate AS `Order Date and Time`, Items AS `Ordered Items` FROM Orders WHERE Format(Orders.OrderDate,'mm/dd/yyyy') >= #" + startDate.Value.Date + "# AND Format(Orders.OrderDate,'mm/dd/yyyy') <= #" + endDate.Value.Date + "#"
adapter.SelectCommand = New OleDb.OleDbCommand(sql, con)
adapter.Fill(ds)
gridReport.DataSource = ds.Tables(0)
Catch ex As Exception
MsgBox("Operation failed. " + ex.ToString)
End Try
如果我在今天的日期在数据库中保存一个新行,并且我将“开始”和“结束”日期都保留为默认日期(即今天的日期),则它不会显示我刚刚保存的新行。今天输入的新行只会在我将“开始日期”移至11月30日时显示。然后我添加一个新行,日期为12月12日。同样,当我选择结束日期为&gt; = 12月12日时,它不会显示,它只会在我将开始日期移动到12月1日时显示。我决定在11月21日输入一行,并在11月21日运行带有开始和结束日期的查询显示该行。然后我在1月8日进入了一个新行..现在任何向上移动startDate和向下移动endDate的组合都不显示1月订单。这是怎么回事??我实际上已经在11月之前尝试过这个代码了,它工作得非常好!
答案 0 :(得分:2)
这可能是什么问题是字符串格式。我不确定Access是否会将字符串转换为Date,然后将Date比较或转换为字符串然后进行比较。你可以试试这个:
Format(Orders.OrderDate,'mm/dd/yyyy') >= Format(#" + startDate.Value.Date + "#,'mm/dd/yyyy')
或者您可以随时直接使用日期,
OrderDate >= #" + startDate.Value.Date + "#"
编辑:,做我的尽职调查,你真的应该做这样的查询
OrderDate >= @StartDate
然后添加此代码
adapter.Parameters.Add("@StartDate", startDate.Value.Date);
使用参数对于健壮的代码非常重要,并且可以避免可怕的SQL注入攻击。