我有一个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形式登录时,显示“索引超出数组范围”错误消息
答案 0 :(得分:0)
将数据对象保留在本地,以确保它们已关闭并已处置。 Using...End Using
块即使出现错误也可以确保这一点。您可以将连接字符串设置为表单级别变量,以便可以在任何地方使用它,但这是唯一需要的表单级别变量。
您可以将连接字符串直接传递给连接的构造函数。
您可以将sql命令文本和连接直接传递给命令的构造函数。
请始终使用参数。它不仅可以避免使用引号引起误解,而且还有助于确保将正确的数据类型发送到数据库。最重要的是,它有助于保护您的数据库免受sql注入的攻击,这可能会破坏数据库。我不得不猜测您数据库中的数据类型。检查数据库并相应地调整代码。
DataReader.Read
方法返回一个Boolean
,因此,检查它是否返回Nothing
是无效的测试。 Boolean
是一个值类型,因此它总是返回True
或False
,而不是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