在日期 VB.NET 和 Access 数据库之间过滤

Filter between dates VB.NET and Access database

正如标题所说,我无法使用 vb.net

从访问数据库中过滤 SQL 句子
Dim data1 As String = DateTimePicker1.Value.ToShortDateString
Dim data2 As String = DateTimePicker2.Value.ToShortDateString
Dim sql As String = "SELECT totais.* From totais Where totais.data Between #" + data1 + "# And #" + data2 + "#;"

它给了我随机值。如果我输入 1-10(October)-2019,它会给我系统中的所有记录,如果我输入 12-10(October)-2019,它只会给出今天的记录(不显示昨天和之前的记录)。我没有找到问题,你能帮忙吗?

谢谢

您需要在 SQL 中使用单引号并转换类型,如下所示:

SELECT totais.* FROM totais WHERE totais.data Between CDATE('" + data1 + "') And CDATE('" + data2 + "');"

我会使用参数而不是为 Sql 语句连接字符串。它使语句更易于阅读并避免语法错误。

对于 OleDb,参数在 sql 语句中出现的顺序必须与它们添加到参数集合中的顺序相匹配,因为 OleDb 不注意参数的名称。

Private Sub OPCode()
    Dim sql As String = "SELECT * From totais Where data Between @StartDate And @EndDate;"
    Using dt As New DataTable
        Using cn As New OleDbConnection("Your connection string"),
            cmd As New OleDbCommand(sql, cn)
            cmd.Parameters.Add("@StartDate", OleDbType.Date).Value = DateTimePicker1.Value
            cmd.Parameters.Add("@EndDate", OleDbType.Date).Value = DateTimePicker2.Value
            cn.Open()
            dt.Load(cmd.ExecuteReader)
        End Using
        DataGridView1.DataSource = dt
    End Using
End Sub

您应该按照 Mary 的回答使用参数,但为了完整性...

Ms/Access 需要指定为#mm/dd/yy# 的日期,因此您的 SQL 只能在本地日期时间格式为 mm/dd/yy 的情况下正常工作。即主要是美国。否则你将不得不格式化你的日期字符串。