VB.NET登录验证后程序终止:需返回表单重新输入凭证
问题解决:VB.NET登录表单无法返回重新填写的修复
问题根源
- 代码末尾强制执行
Me.Hide(),无论登录成功/失败/空字段场景,都会隐藏当前表单,导致程序看似终止 - 空字段判断逻辑存在漏洞:仅当用户名和密码同时为空时才触发提示,单个字段为空时无法检测
- 存在SQL注入风险,且未对数据库操作做异常处理
修改后的完整代码
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim user As String = TextBox1.Text.Trim() Dim pword As String = TextBox2.Text.Trim() ' 先做空字段校验,无需提前连接数据库 If String.IsNullOrWhiteSpace(user) OrElse String.IsNullOrWhiteSpace(pword) Then MsgBox("请填写完整的用户名和密码") TextBox1.Focus() ' 定位到用户名输入框,方便重新填写 Return ' 终止后续代码执行,停留在当前表单 End If Try ConnectToDB() ' 使用参数化查询避免SQL注入 sql = "select * from rfidmaintest.administrator where username = @user And pword = @pword" cmd = New MySqlCommand(sql, cn) cmd.Parameters.AddWithValue("@user", user) cmd.Parameters.AddWithValue("@pword", pword) dr = cmd.ExecuteReader If dr.HasRows Then Me.Hide() admin.ShowDialog() ' 管理员窗口关闭后,重新显示登录表单(可根据需求选择保留或移除) Me.Show() Else MsgBox("用户不存在或密码错误") TextBox1.Clear() TextBox2.Clear() TextBox1.Focus() End If Catch ex As Exception MsgBox("数据库连接异常:" & ex.Message) Finally ' 确保数据库资源被正确释放,无论是否发生异常 If dr IsNot Nothing AndAlso Not dr.IsClosed Then dr.Close() End If If cn IsNot Nothing AndAlso cn.State = ConnectionState.Open Then cn.Close() End If cmd = Nothing End Try ' 移除原代码中强制执行的Me.Hide() End Sub
关键修改说明
- 移除全局
Me.Hide():仅在登录成功时隐藏当前表单,其他场景保留表单显示 - 修复空字段判断:用
String.IsNullOrWhiteSpace检测单个字段是否为空,覆盖所有未填场景,且添加Return直接终止后续代码,停留在当前表单 - 参数化查询:替换字符串拼接的SQL写法,彻底避免SQL注入风险
- 异常处理:用
Try-Catch-Finally确保数据库资源被正确释放,同时捕获并提示连接异常 - 体验优化:清空输入框后自动聚焦到用户名,减少用户操作步骤;管理员窗口关闭后可自动恢复登录表单显示
内容的提问来源于stack exchange,提问作者user19101467
相关产品推荐
相关产品推荐

