VB.NET连接MySQL数据库时触发System.InvalidOperationException异常求助
排查VB.NET中MySQL登录功能的System.InvalidOperationException异常
看起来你这个异常主要是代码里的几个细节问题导致的,我帮你梳理下问题点和修复方案:
核心问题分析
MySqlDataAdapter未关联查询命令
你创建了MySqlDataAdapter但没有给它指定要执行的查询命令,调用Fill()的时候就会触发InvalidOperationException——因为适配器不知道要执行什么SQL来填充DataTable。数据库连接的资源管理不规范
直接在类级别声明connection对象,没有用Using语句管理,容易导致连接泄漏;而且如果Open()过程中出错,后续的Close()可能不会执行,进一步加剧资源问题。冗余代码干扰
注释掉的cmd.ExecuteNonQuery()完全没必要,DataAdapter.Fill()会自动执行查询并填充结果,手动执行反而会重复操作。
修复后的完整代码
我把你的代码做了修正,加上了资源管理和异常捕获,这样能更稳定运行,也方便排查问题:
Imports System.Data Imports MySql.Data Imports MySql.Data.MySqlClient Public Class formLogin Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click ' 连接字符串:建议后续把敏感信息(比如密码)移到配置文件,不要硬编码 Dim connStr As String = "server=localhost;user=root;database=ssknet;port=3306;password=;" ' Using语句会自动释放实现IDisposable的对象,不用手动Close/Dispose,更安全 Using connection As New MySqlConnection(connStr) Try connection.Open() ' 参数化查询:避免SQL注入,同时确保参数类型匹配 Dim cmd As New MySqlCommand("SELECT * FROM user WHERE username=@username and password=@password", connection) cmd.Parameters.Add("@username", MySqlDbType.VarChar).Value = txtUsername.Text.Trim() ' 去除输入的前后空格 cmd.Parameters.Add("@password", MySqlDbType.VarChar).Value = txtPassword.Text.Trim() ' 给DataAdapter绑定查询命令,这是解决你当前异常的关键步骤 Dim adapter As New MySqlDataAdapter(cmd) Dim table As New DataTable ' 填充DataTable adapter.Fill(table) ' 判断登录结果 If table.Rows.Count <= 0 Then MessageBox.Show("Invalid Username or Password") Else MessageBox.Show("Login Success!") End If Catch ex As Exception ' 捕获所有异常并显示详细信息,方便你定位具体问题(比如连接失败、表不存在等) MessageBox.Show($"登录出错:{ex.Message}{vbCrLf}{ex.InnerException?.Message}") End Try End Using End Sub End Class
额外排查要点
如果修复后还是有问题,可以从这几个方向检查:
- 确认MySQL服务是否正常运行:打开任务管理器或者服务列表,看看MySQL服务有没有启动。
- 验证连接字符串正确性:检查root用户的密码是否正确,数据库
ssknet是否存在,端口3306是否被占用或者修改过。 - 检查user表结构:确保表名是
user(MySQL在Linux下大小写敏感,Windows下不敏感),字段username和password存在且类型是VARCHAR类。
内容的提问来源于stack exchange,提问作者ssk developer
相关产品推荐
相关产品推荐

