索引在Mysql中超出绑定数组范围

时间:2019-05-18 08:26:18

标签: mysql vb.net

我有一个MySQL表用于存储用户详细信息,其中包含3列,即“ UserName”,“ password”,“ Access Level”。当我尝试将详细信息加载到VB.net变量中时,它显示“索引超出限制范围” 我是mysql新手,请帮忙

我试图更改mysqldatareader()的索引值

DBConnectionMySql()
myCommandMySql.Connection = myConnectionMySql
myConnectionMySql.Open()
'-----
myCommandMySql.CommandText = "select * from tbl_userregistration where UserName = '" & Trim(Username_TextBox.Text) & "'"
myDataReaderMySql = myCommandMySql.ExecuteReader
If myDataReaderMySql.Read() = Nothing Then
    MessageBox.Show("Invalide User Name you Enter!", "Username/Password checker", MessageBoxButtons.OK, MessageBoxIcon.Warning)
    Username_TextBox.Focus()
Else
    If Username_TextBox.Text = myDataReaderMySql(1) And Password_TextBox.Text = myDataReaderMySql(2) Then
        user = Username_TextBox.Text
        username = Username_TextBox.Text
        Weighing_frm.Show()
        Me.Visible = False
        Me.Refresh()
    Else
        MessageBox.Show("Invalide Username Or Password please check and Re-Login!", "Username/Password checker", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        Username_TextBox.Focus()

当我尝试从加载的数据以vb.net形式登录时,显示“索引超出数组范围”错误消​​息

1 个答案:

答案 0 :(得分:0)

将数据对象保留在本地,以确保它们已关闭并已处置。 Using...End Using块即使出现错误也可以确保这一点。您可以将连接字符串设置为表单级别变量,以便可以在任何地方使用它,但这是唯一需要的表单级别变量。

您可以将连接字符串直接传递给连接的构造函数。

您可以将sql命令文本和连接直接传递给命令的构造函数。

请始终使用参数。它不仅可以避免使用引号引起误解,而且还有助于确保将正确的数据类型发送到数据库。最重要的是,它有助于保护您的数据库免受sql注入的攻击,这可能会破坏数据库。我不得不猜测您数据库中的数据类型。检查数据库并相应地调整代码。

DataReader.Read方法返回一个Boolean,因此,检查它是否返回Nothing是无效的测试。 Boolean是一个值类型,因此它总是返回TrueFalse,而不是Nothing

用户名将始终匹配,因为这是您在where子句中发送给数据库的内容。如@Jimi的评论中所述,数据读取器返回的字段的索引从0开始,因此,用户名将为0,密码为1,访问级别为2。.net中几乎所有集合都从索引0开始。

为什么要使用两个具有相同值的不同变量?

user = Username_TextBox.Text
username = Username_TextBox.Text

这应该怎么办?

Me.Refresh()

在真实的应用程序中,您永远不会将密码存储为纯文本。它们会被加盐和散列。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Using cn As New MySqlConnection("Your connection string")
        Using cmd As New MySqlCommand("select * from tbl_userregistration where UserName = @UserName;", cn)
            cmd.Parameters.Add("@UserName", MySqlDbType.Text).Value = Trim(Username_TextBox.Text)
            cn.Open()
            Using dr = cmd.ExecuteReader
                If dr.HasRows Then
                    dr.Read()
                    If Password_TextBox.Text = myDataReaderMySql(1) Then
                        user = Username_TextBox.Text
                        Weighing_frm.Show()
                        Me.Visible = False
                    Else
                        MessageBox.Show("Invalide Username Or Password please check and Re-Login!", "Username/Password checker", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                        Username_TextBox.Focus()
                    End If
                Else
                    MessageBox.Show("Invalid User Name you Enter!", "Username/Password checker", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                    Username_TextBox.Focus()
                End If
            End Using
        End Using
    End Using
End Sub