You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET加载MySQL当前/指定月份数据及多查询条件有效性咨询

问题解答与代码优化

一、多条件查询的可行性

完全可行,在WHERE子句后用AND或OR连接多个条件是SQL的标准写法,你的理解是对的。

二、按月份查询数据的正确方式

你的代码里直接将日期字段与月份数字比较是错误的——日期类型字段不能直接和数字匹配,需要用MySQL的日期函数提取月份,或用日期范围查询(后者能利用字段索引,效率更高):

方式1:用MONTH()函数提取月份

查询当前月份数据时必须加上年份条件,避免匹配往年同月份的数据:

SELECT * FROM tblchecklist 
WHERE MONTH(checkdate) = MONTH(NOW()) 
AND YEAR(checkdate) = YEAR(NOW())
AND check_number = ?

查询指定月份(比如输入的月份值):

SELECT * FROM tblchecklist 
WHERE MONTH(checkdate) = ? 
AND YEAR(checkdate) = YEAR(NOW()) -- 若需指定年份,替换为具体年份参数
AND check_number = ?

方式2:日期范围查询(推荐)

这种方式能利用checkdate字段的索引,查询效率更高:
当前月份的范围是当月1日0点到下月1日0点:

SELECT * FROM tblchecklist 
WHERE checkdate >= DATE_FORMAT(NOW(), '%Y-%m-01') 
AND checkdate < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH)
AND check_number = ?

指定月份(比如2024年5月):

SELECT * FROM tblchecklist 
WHERE checkdate >= '2024-05-01' 
AND checkdate < '2024-06-01'
AND check_number = ?

三、你的代码优化(重点:参数化查询,避免SQL注入)

原代码用字符串拼接SQL语句,存在严重的SQL注入风险,且有语法错误,以下是修正后的代码:

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    TextBox1.Text = DateTime.Now.Month.ToString
    Try
        conn.Open()
        -- 参数化SQL,避免注入,同时正确查询当前月份数据
        Dim sql As String = "SELECT * FROM tblchecklist " &
                            "WHERE checkdate >= DATE_FORMAT(NOW(), '%Y-%m-01') " &
                            "AND checkdate < DATE_ADD(DATE_FORMAT(NOW(), '%Y-%m-01'), INTERVAL 1 MONTH) " &
                            "AND check_number = @CheckNumber"
        
        Dim cmd As New MySqlCommand(sql, conn)
        -- 添加参数,替代字符串拼接
        cmd.Parameters.AddWithValue("@CheckNumber", Label1.Text)
        
        dr = cmd.ExecuteReader
        DataGridView1.Rows.Clear() -- 清空现有行,避免重复加载
        While dr.Read
            DataGridView1.Rows.Add(
                dr.Item("ID"), 
                dr.Item("check_corporate"), 
                dr.Item("check_date"), 
                dr.Item("check_num"), 
                dr.Item("check_name"), 
                dr.Item("check_memo"), 
                dr.Item("check_amount"), 
                dr.Item("check_group"), 
                dr.Item("date_deposit"), 
                dr.Item("date_release"), 
                dr.Item("status")
            )
        End While
        dr.Dispose()
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        -- 确保连接关闭,即使出错也会执行
        If conn.State = ConnectionState.Open Then
            conn.Close()
        End If
    End Try
End Sub

优化点说明:

  • 改用参数化查询,彻底规避SQL注入风险
  • 使用日期范围查询替代MONTH()函数,提升查询效率
  • 添加DataGridView1.Rows.Clear()避免重复加载数据
  • 用Finally块确保数据库连接一定会关闭,避免连接泄漏
  • 修正原SQL语句的引号不匹配问题

四、查询指定月份的代码调整

如果要查询TextBox1中输入的指定月份,修改SQL和参数即可:

Dim targetMonth As Integer = Integer.Parse(TextBox1.Text)
Dim targetYear As Integer = DateTime.Now.Year -- 可改为用户指定的年份
Dim startDate As DateTime = New DateTime(targetYear, targetMonth, 1)
Dim endDate As DateTime = startDate.AddMonths(1)

Dim sql As String = "SELECT * FROM tblchecklist " &
                    "WHERE checkdate >= @StartDate " &
                    "AND checkdate < @EndDate " &
                    "AND check_number = @CheckNumber"

Dim cmd As New MySqlCommand(sql, conn)
cmd.Parameters.AddWithValue("@StartDate", startDate)
cmd.Parameters.AddWithValue("@EndDate", endDate)
cmd.Parameters.AddWithValue("@CheckNumber", Label1.Text)

内容的提问来源于stack exchange,提问作者Nnek Lecxe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:20:26