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
相关产品推荐
相关产品推荐

