【问题标题】:Select between from database - select data for whole month从数据库中选择 - 选择整个月的数据
【发布时间】:2014-07-05 21:11:55
【问题描述】:

我有一个组合框,其中包含 01-12(月)的项目,根据选定的月份,数据是从 datagridview 中的数据库中提取的。然后将选定的值(月份)放入 label5。

在日期之间选择可以正常工作,但如何选择 1 个月内的所有天而无需为每个月定义天数范围(因为有些年份在 2 月有 29 天,所以这是行不通的)。

我已经尝试过了(我已将 31 天结束范围以涵盖任何一个月中的所有天,但这导致了错误,因为 Label5.text = "02" 并且 VB.NET 不知何故知道没有 31二月天数:

Dim SQLString As String = "SELECT KONTO, NALOG, DUGUJE, POTRAZUJE, 
    DATPRO, OPIS 
    FROM PROMGL WHERE DATPRO between #" & Label5.Text & "/1/2014# and #" 
    & Label5.Text & "/31/2014#" 

我能做什么?

【问题讨论】:

  • 为什么不使用 DateTimePicker 以确保数据值始终正确?您还应该使用参数化查询
  • 我只需要整个月的数据,选择日期会使事情变得复杂,无论如何,在这种情况下,我可以使用两个蒙面的文本框作为日期,但我确实需要通过选择月份来显示数据。附言我找到了一篇关于参数化查询的文章,但这对我来说太复杂了(我是编程初学者)。
  • 然后使用范围为 1-12 的 NumericUpDown,但从结果中创建实际日期以用作参数。例如:对于 EndDate,从 5/1 的 DATE 开始,然后备份/减去一天以获得 4 月的最后一天

标签: vb.net date select


【解决方案1】:

这应该非常小心,因为它对 SQL 注入非常开放,所以你可以这样做:

Dim month as Integer = 0

If Not Integer.TryParse(Label5.Text, month) Then
    Exit Sub
End If

Dim startDate as New DateTime(2014,month,1)
Dim endDate as DateTime = startDate.AddMonths(1).AddDays(-1)

Dim SQLString As String = "SELECT KONTO, NALOG, DUGUJE, POTRAZUJE, 
    DATPRO, OPIS 
    FROM PROMGL WHERE DATPRO between #" & startDate.ToString("MM/d/yyy") & "# and #" 
    & endDate.ToString("MM/dd/yyyy") & "#"

【讨论】:

  • 哇。太感谢了。谁知道我要学多少才能这么快就想出一个。
【解决方案2】:

对下个月的第一天使用< 运算符:

Dim month As Integer = Int32.Parse(Label5.Text)
Dim SQLString As String = "SELECT KONTO, NALOG, DUGUJE, POTRAZUJE,
  DATPRO, OPIS 
  FROM PROMGL WHERE DATPRO >= #" & month & "/1/2014# and DATPRO < #" 
  & (month + 1) & "/1/2014#"

将值解析为整数还可以保护您免受 SQL 注入攻击。在不确保它不会破坏它的情况下,你永远不应该直接在查询中使用一个值。通常使用参数化查询来简化此操作。

注意:编写的代码仅在 11 月之前有效,您还需要调整年份以支持 12 月。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2021-03-26
    • 2012-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2014-11-02
    相关资源
    最近更新 更多