我有点难过,希望有人可以帮忙!
我正在尝试执行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
这根本不显示任何数据......它没有抛出任何错误,它正在拉动标题,但只显示没有数据..有什么建议吗?
由于
答案 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)