You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms C# MySqlConnector报Connect Timeout Expired错误排查

错误原因说明

你遇到的 MySqlConnector.MySqlException: 'Connect Timeout expired.' 错误,本质是程序在默认超时窗口内没有成功和MySQL服务建立有效网络连接。
你贴出的调用栈全部是Xamarin.Android运行时、Mono框架层的异步异常抛转链路,属于系统把未捕获的异常传递给调试器的通用流程,没有业务层错误定位价值,不需要逐行分析这些栈帧。
触发连接超时以及你代码里的关联问题如下:

  • 连接字符串配置错误:你写的server=localhost在Android环境下指向的是模拟器/真机自身的本地回环地址,不是你运行MySQL服务的开发电脑地址,程序往手机自身的3306端口发连接请求,自然不可能连上。
  • 连接方法调用错误:你在异步方法里用了同步的connection.Open(),在移动端的单线程同步上下文下,同步阻塞等待连接很容易触发死锁,额外放大超时概率。
  • 数据库权限/网络配置缺失:默认MySQL配置只允许本机localhost发起连接,就算地址填对,如果没给数据库用户开远程访问权限、没放行电脑防火墙的3306端口,一样会连接失败。
  • 附带的代码逻辑错误:你的SQL语句SELECT _Password FROM * WHERE email=存在语法错误,FROM后必须指定具体表名,且直接拼接用户输入的内容既存在SQL注入风险,也会因为字符串值没加引号导致SQL执行失败;另外你没有调用reader.Read()就直接读结果集,就算连接成功也会抛出异常。
修复方案

第一步:调整环境配置

  1. 给MySQL的app用户授权远程访问权限,放行开发机防火墙对3306端口的入站访问。
  2. 替换连接字符串里的服务地址:用Android模拟器调试时,访问宿主机的特殊地址为10.0.2.2;用真机调试时,填写开发机在当前局域网的实际IP(比如192.168.1.5这类),保证手机和电脑连在同一个局域网下。可适当在连接字符串里加Connect Timeout=10延长超时阈值,适配移动端弱网环境。

第二步:修正业务代码

修正后的参考代码如下,注意把SQL里的表名替换成你实际的用户表名:

async void LoginClick(object sender, EventArgs args)
{
    string enter_email = Email.Text;
    // 模拟器调试用10.0.2.2,真机调试替换为开发机局域网IP
    string connStr = "server=10.0.2.2;user=app;database=travel_logger;port=3306;password=app;Connect Timeout=10";
    using (var connection = new MySqlConnection(connStr))
    {
        // 用异步方法建立连接,避免阻塞UI线程
        await connection.OpenAsync();
        // 替换users为你实际存储用户信息的表名,用参数化查询避免SQL注入和语法错误
        using var cmd = new MySqlCommand("SELECT _Password FROM users WHERE email=@email", connection);
        cmd.Parameters.AddWithValue("@email", enter_email);
        using var reader = await cmd.ExecuteReaderAsync();
        // 先读取查询结果行再取值
        if (await reader.ReadAsync())
        {
            string data_password = reader.GetString(0);
            if (data_password == Password.Text)
            {
                await Navigation.PushAsync(new AboutPage());
            }
        }
        else
        {
            // 可在此处添加账号不存在的提示逻辑
        }
    } 
}

额外优化建议

  • 移动端App不建议直接直连MySQL数据库,这种架构会把数据库地址、账号密码硬编码在客户端,极易被反编译后拖库,正规实现应该在服务端封装登录接口,App通过HTTP请求调用接口完成校验。
  • 密码不要明文存储在数据库中,应当加盐做哈希处理后存储,避免数据库泄露后用户密码直接失窃。

内容的提问来源于stack exchange,提问作者Jsheerin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:54:21