MySQL与UWP问题:调用ExecuteReader()无法执行查询
解决UWP(秋季创意者更新)中MySQL ExecuteReader()异常的方案
结合你给出的代码片段和UWP平台的特性,我整理了几个大概率触发异常的点和对应解决办法:
1. 先搞定驱动版本兼容性
UWP(尤其是秋季创意者更新这类较早的版本)对MySQL .NET驱动的版本要求很严格,别用最新的MySqlConnector,建议锁定MySql.Data 6.10.9版本——这是官方支持旧版UWP的最后几个稳定版本之一。高版本驱动大概率会触发类型加载或平台不兼容的异常。
2. 规范连接与命令的生命周期管理
你的代码已经打开了连接,但UWP更适合用异步方法(避免阻塞UI线程,还能减少连接状态异常),同时用using语句自动释放资源,避免连接泄漏。调整后的完整代码示例:
using (MySqlConnection conn = Util.GetConnection("Server=localhost;Port=3306;Database=sample;Uid=root;Pwd=;CharSet=utf8;SslMode=None;")) { await conn.OpenAsync(); string commandText = "SELECT id, role FROM tblUsers WHERE username = @user AND password = @pass"; using (MySqlCommand cmd = new MySqlCommand(commandText, conn)) { cmd.CommandType = CommandType.Text; // 补全参数添加,注意参数名要和SQL占位符完全匹配 cmd.Parameters.AddWithValue("@user", yourUsernameInput); cmd.Parameters.AddWithValue("@pass", yourPasswordInput); // 用异步读取器替代同步方法 using (MySqlDataReader reader = await cmd.ExecuteReaderAsync()) { while (await reader.ReadAsync()) { // 处理读取到的数据 int id = reader.GetInt32("id"); string role = reader.GetString("role"); } } } }
这样能避免“连接状态已关闭”这类常见异常。
3. 解除UWP沙箱的Loopback限制
UWP默认禁止应用访问本地回环地址(localhost),如果你的MySQL服务在本地,必须开启Loopback豁免。以管理员身份运行PowerShell,执行以下命令:
CheckNetIsolation LoopbackExempt -a -n="你的应用包名"
应用包名可以在Visual Studio的Package.appxmanifest→「打包」选项卡中找到。没开这个的话,会触发连接超时或拒绝访问的异常。
4. 验证MySQL用户权限
确保root@localhost用户确实能无密码访问sample数据库,先在MySQL客户端执行:
GRANT ALL ON sample.* TO 'root'@'localhost' IDENTIFIED BY ''; FLUSH PRIVILEGES;
权限配置错误会直接触发“Access denied”异常,这也是高频踩坑点。
最后补全参数添加逻辑
你代码里的cmd.Parameters.AddWithV...没写完,要确保参数名和SQL里的@user、@pass完全匹配,同时传入的参数值符合数据库字段的要求(比如不能为null如果字段不允许的话)。
内容的提问来源于stack exchange,提问作者Phantom
相关产品推荐
相关产品推荐

