VB.NET使用DateTimePicker查询日期区间数据时遇数组越界错误排查
问题分析与解决方案
错误原因
- 日期格式与SQL注入问题:你用
#包裹日期是Access数据库的写法,MySQL需要用单引号',但直接拼接DateTimePicker.Value会因系统区域差异导致日期格式不被MySQL识别,同时存在严重的SQL注入风险。 - 手动添加行的列数不匹配:
DataGridView1.Rows.Add()中传入的字段数量如果和DataGridView的列数不一致,或者数据库字段名拼写错误(比如实际字段名是CheckDate而非check_date),就会触发“索引超出数组界限”错误。 - 资源释放不严谨:
conn.Close()放在Try块外,若发生异常连接无法正常关闭;dr.Dispose()未在Finally中执行,可能导致资源泄漏。
正确实现代码
推荐使用参数化查询+数据源绑定的方式,既安全又避免手动添加行的错误:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim dt As New DataTable() Try conn.Open() ' 使用参数化查询,避免SQL注入和日期格式问题 Dim cmd As New MySqlCommand("SELECT ID, check_corporate, check_date, check_num, check_name, check_memo, check_amount, check_group, date_deposit, date_release, status FROM tblchecklist WHERE check_date BETWEEN @StartDate AND @EndDate", conn) ' 添加参数,自动处理日期格式 cmd.Parameters.AddWithValue("@StartDate", DateTimePicker1.Value.Date) cmd.Parameters.AddWithValue("@EndDate", DateTimePicker2.Value.Date) Dim da As New MySqlDataAdapter(cmd) da.Fill(dt) ' 绑定数据源到DataGridView,自动匹配列 DataGridView1.DataSource = dt Catch ex As Exception MsgBox("查询出错:" & ex.Message) Finally ' 确保连接无论是否异常都关闭 If conn.State = ConnectionState.Open Then conn.Close() End If End Try End Sub
额外注意事项
- DataGridView列配置:如果需要自定义列显示,提前在设计器中添加对应列,并设置
DataPropertyName为数据库字段名(比如列的DataPropertyName设为check_date,绑定数据源时会自动匹配)。 - 日期范围验证:可以在查询前添加判断,确保
DateTimePicker1.Value <= DateTimePicker2.Value,避免无效的日期区间。 - 连接对象复用:确保
conn是全局或正确初始化的MySqlConnection对象,避免重复创建。
内容的提问来源于stack exchange,提问作者Nnek Lecxe
相关产品推荐
相关产品推荐

