vb.net 2 个日期选择器之间检索数据...索引超出了数组的边界

vb.net retrieving data between 2 datepicker ... index was outside the bounds of the array

提问人:Nnek Lecxe 提问时间:10/20/2023 更新时间:10/21/2023 访问量:55

问:

我哪里做错了?如何在 2 个日期之间提取数据

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     Try
         conn.Open()
         Dim cmd As New MySqlCommand("select * from tblchecklist where check_date between #" & DateTimePicker1.Value & "# and #" & DateTimePicker2.Value & "#", conn)
         dr = cmd.ExecuteReader
         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)
     End Try
     conn.Close()
 End Sub
.net vb.net

评论

0赞 Andrew Mortimer 10/20/2023
添加 Using 语句,使用参数进行查询,不要连接查询的字符串,然后使用调试器单步执行,以查看在哪一行上出现错误。
0赞 jmcilhinney 10/20/2023
也许你应该读过MySQL的有效语法。仅仅编写 SQL 代码而不确认它对您的数据库有效,注定会以眼泪告终。

答:

0赞 Michael Foster 10/20/2023 #1

编辑:结合安德鲁·莫蒂默(Andrew Mortimer)的评论,这些评论对于良好的编程实践是正确的。

我认为您收到错误是因为您使用的是日期的 VB 格式而不是 SQL 格式。尝试用以下代码替换您的行:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     Try
        conn.Open()
        Using cmd As New MySqlCommand("select * from tblchecklist where check_date between @FirstDate and @SecondDate", conn)
            cmd.Parameters.Add("@FirstDate", SqlDbType.Date).Value = DateTimePicker1.Value
            cmd.Parameters.Add("@SecondDate", SqlDbType.Date).Value = DateTimePicker2.Value
            Using dr As SqlDataReader = cmd.ExecuteReader
                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
            End Using
        End Using
    Catch ex As Exception
        MsgBox(ex)
    End Try
    conn.Close()
End Sub

SQL 希望单引号作为字符串/日期分隔符,但如果您使用参数,则根本不需要任何东西。

如果这不起作用,则需要提供实际导致错误的语句。这将在堆栈跟踪中,这就是为什么我也将 更改为整体显示。如果错误出现在添加到数据网格的行上,则 SQL 列名称或指定的列名称中可能有拼写错误。MsgBoxexItem

否则,我们需要更多的信息才能缩小范围。

评论

0赞 Nnek Lecxe 10/20/2023
尝试了您的代码,但似乎什么也没做。什么也没发生,也没有弹出错误
0赞 Michael Foster 10/21/2023
@NnekLecxe,我修改了我的答案,这改变了它。
0赞 Nnek Lecxe 10/21/2023
它说“System.ArgumentException:'参数'提示'无法转换为类型'String'。对不起,我不是很精通mysql查询,参数等...
0赞 Michael Foster 10/23/2023
你能发布堆栈跟踪吗?我也需要知道发生错误的行号,但我没有行号,所以你必须把它翻译成哪一行。
0赞 Vector 10/26/2023
试试这个 使用 cmd 作为新的 MySqlCommand(“select * from tblchecklist where check_date between ( @FirstDate and @SecondDate”), conn) 也许将“and”更改为逗号