在两个DateTimePicker值之间进行SELECT

时间:2015-09-30 08:11:37

标签: sql vb.net

我有点难过,希望有人可以帮忙!

我正在尝试执行SQL SELECT命令来显示一组日期在DateTimePicker1和DateTimePicker2之间设置的值,这是我的代码:

        If ComboBox1.Text = "All" Then
        da = New OleDbDataAdapter("SELECT * FROM Times WHERE ([Date] BETWEEN '" & DateTimePicker1.Value & "' AND '" & DateTimePicker2.Value & "')", MyConn)
        da.Fill(ds, "Times")
        Dim view1 As New DataView(tables(0))
        source1.DataSource = view1
        DataGridView1.DataSource = view1
        Exit Sub
    End If

此代码有点工作......它将信息从Access数据库中提取出来(我限制使用Access ...)并在DataGrid中显示它。

我遇到的麻烦是它从范围之间的dd中选择了所有内容,即:

DateTimePicker1等于03/08/2015 DateTimePicker2等于05/08/2015

撤回的数据是:

03/06/2015
04/06/2015
05/06/2015
03/07/2015
04/07/2015
05/07/2015
03/08/2015
04/08/2015
05/08/2015

似乎只使用dd值而不是整个日期值..

我认为这只是一个语法错误,但我真的很难弄清楚在哪里!

谢谢!

我现在已将代码更改为:

    If ComboBox1.Text = "All" Then
        Dim sql = "SELECT * FROM Times WHERE [Date] BETWEEN @StartDate AND @EndDate"
        Dim cmd = New OleDbCommand(sql, MyConn)
        cmd.Parameters.AddWithValue("@StartDate", DateTimePicker1.Value)
        cmd.Parameters.AddWithValue("@EndpDate", DateTimePicker2.Value)
        Dim da = New OleDbDataAdapter(cmd)
        da.Fill(ds, "Times")
        Dim view1 As New DataView(tables(0))
        source1.DataSource = view1
        DataGridView1.DataSource = view1
        Exit Sub
    End If

这根本不显示任何数据......它没有抛出任何错误,它正在拉动标题,但只显示没有数据..有什么建议吗?

由于

2 个答案:

答案 0 :(得分:2)

始终使用sql参数(例如,防止sql注入),这可能也解决了这个问题:

Dim sql = "SELECT * FROM Times WHERE [Date] BETWEEN @StartDate AND @EndDate"
Dim cmd = New OleDbCommand(sql, MyConn)
cmd.Parameters.AddWithValue("@StartDate", DateTimePicker1.Value);
cmd.Parameters.AddWithValue("@EndpDate", DateTimePicker2.Value);
Dim da = New OleDbDataAdapter(cmd)

也许您还想截断DateTime的时间部分:

cmd.Parameters.AddWithValue("@StartDate", DateTimePicker1.Value.Date);
cmd.Parameters.AddWithValue("@EndpDate", DateTimePicker2.Value.Date);

Bu,因为DateTimePicker2.Value.Date截断了时间,这意味着您从午夜选择,而不是在当天选择。然后,您需要添加一天来包含结束日期,因此DateTimePicker2.Value.Date.AddDays(1)。但如果那是午夜,那还将包括第二天的数据。因此,不要使用Between,而是使用>=<

所以这是一个更好的方法:

Dim sql = "SELECT * FROM Times WHERE [Date] >= @StartDate AND [Date] < @EndDate"

cmd.Parameters.AddWithValue("@StartDate", DateTimePicker1.Value.Date);
cmd.Parameters.AddWithValue("@EndpDate", DateTimePicker2.Value.Date.AddDays(1));

答案 1 :(得分:0)

如果你挣扎,请尝试使用&lt; &安培; &GT;运营商:

da = New OleDbDataAdapter("SELECT * FROM Times WHERE ([Date] >= 'DateTimePicker1.Value' &&  [Date] <= 'DateTimePicker2.Value')", MyConn)