Visual Basic关联MySQL的登录按钮代码运行报错,请问问题出在哪里?
代码存在的问题
- 重复初始化数据库连接对象,冗余且易引发异常:先实例化了空的
MySqlConnection,又再次实例化带连接串的对象,还在With块里重复赋值连接字符串,属于无意义的重复操作。 - 用户名、密码参数与查询字段完全倒置:SQL语句中
User_Name字段匹配的是密码输入框Pass_txtbx.Text,Password字段匹配的是用户名输入框UserN_txtbx.Text,直接导致合法账号也无法匹配登录。 - 用
Const修饰动态字符串引发语法错误:V被定义为常量,但拼接了文本框的动态输入值,不符合常量编译时确定值的要求,运行时会直接报错。 - 字符串拼接SQL存在两大风险:一是用户输入含单引号时会触发SQL语法错误,二是存在严重的SQL注入漏洞,攻击者可通过特殊输入绕过登录甚至篡改数据库。
- 数据库资源未释放:
MySqlConnection、MySqlCommand、MySqlDataReader使用后未主动关闭释放,长期运行会造成连接池资源泄漏。 - 异常捕获范围不全:仅捕获
MySqlException,其他运行时异常(如空引用、控件访问异常)会直接抛出无处理,且异常触发时已打开的数据库连接不会自动关闭。 - 查询效率低下:没必要通过遍历DataReader计数,直接执行
COUNT(*)查询配合ExecuteScalar性能更高。
修正后的参考代码
Private Sub LogIn_btn_Click(sender As Object, e As EventArgs) Handles LogIn_btn.Click ' 仅初始化一次连接,用Using自动释放资源 Using dbconn As New MySqlConnection("Data Source=localhost;user id=root;password=root;database=oeas") Try dbconn.Open() ' 参数化查询,避免注入和语法问题 Dim query As String = "SELECT COUNT(*) FROM oeas.users WHERE User_Name = @UserName AND Password = @PassWord" Using sqlcmd As New MySqlCommand(query, dbconn) ' 对应添加参数,注意字段和输入框对应关系 sqlcmd.Parameters.AddWithValue("@UserName", UserN_txtbx.Text.Trim()) sqlcmd.Parameters.AddWithValue("@PassWord", Pass_txtbx.Text.Trim()) Dim count As Integer = Convert.ToInt32(sqlcmd.ExecuteScalar()) If count = 1 Then MessageBox.Show("username and password are correct") Profile_form.Show() Me.Hide() ElseIf count > 1 Then MessageBox.Show("username and password are duplicate") Else MessageBox.Show("username and password are not correct") End If End Using Catch ex As Exception MsgBox("操作错误: " & ex.Message) End Try End Using ' 退出Using块自动关闭释放连接 End Sub
内容的提问来源于stack exchange,提问作者Antony Sydney
相关产品推荐
相关产品推荐

