【问题标题】:Selecting rows from Access database by date search criteria in VB.NET form在 VB.NET 表单中按日期搜索条件从 Access 数据库中选择行
【发布时间】:2012-12-07 19:29:20
【问题描述】:

我有一个非常简单的问题。我的 VB.NET 表单上有几个日期选择器控件,用户选择“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 日的新行。同样,当我选择结束日期为 >= 12 月 12 日时它不会显示,它只会在我将开始日期移至 12 月 1 日时显示。我决定输入日期为 11 月 21 日的行,并在 11 月 21 日运行开始日期和结束日期的查询会显示该行。然后我在 1 月 8 日输入了一个新行。现在向上移动 startDate 和/或向下移动 endDate 的任何组合都不会显示一月份的订单。这是怎么回事??实际上,我在 11 月之前已经尝试过这段代码,而且效果非常好!

【问题讨论】:

  • 只有 MySql 对 tablecolumn 名称使用反引号(` 字符)。我知道没有其他数据库可以做到这一点。 ansi 标准是使用“双引号”。
  • 另外,使用字符串连接将日期放入查询中的方式非常糟糕。它使您容易受到 sql 注入攻击。改为了解参数化查询。

标签: vb.net date datepicker ms-access-2007


【解决方案1】:

这可能是字符串格式的问题。我不确定Access是否会将字符串转换为日期然后进行比较或将日期转换为字符串然后进行比较。你可以试试这个:

Format(Orders.OrderDate,'mm/dd/yyyy') &gt;= Format(#" + startDate.Value.Date + "#,'mm/dd/yyyy')

或者你可以直接使用日期,

OrderDate &gt;= #" + startDate.Value.Date + "#"

编辑:做我的尽职调查,你真的应该做这样的查询

OrderDate >= @StartDate

然后添加这段代码

adapter.Parameters.Add("@StartDate", startDate.Value.Date);

使用参数对于健壮的代码和避免可怕的 SQL 注入攻击很重要。

【讨论】:

  • 任何不推送参数化查询的答案都是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多