Xamarin Android访客登录应用MySQL连接失败求助
嘿,我看到你在用Visual Studio 17开发Xamarin Android访客登录应用时,点击登录按钮出现了远程MySQL连接错误,咱们一步步来排查和解决这个问题。
首先,先看你提供的代码里几个明显的问题,再延伸到远程连接的常见坑点:
1. 代码里的直接错误
你粘贴的代码最后一行cmd.Parameters.AddWithValue("@",...);明显是未完成的,这会直接导致语法错误,必须补全缺失的参数。另外,你在OnCreateView里获取单选按钮的选中状态是不对的——这个方法是在Dialog刚创建时执行的,用户还没机会选择单选按钮,所以citizenStatus和classification大概率是空值,插入数据库时会出问题。
修正后的登录点击事件代码
我帮你补全了参数,添加了错误捕获,并且把单选按钮状态的获取移到了点击事件里:
void SignIn_Click(object sender, EventArgs e) { // 先获取用户实际选择的单选按钮状态 citizenStatus = radCitizen.Checked ? "Citizen" : "Not A Citizen"; classification = radClassified.Checked ? "Classified" : "Unclassified"; try { int badgeNum = new Random().Next(100000, 999999); DateTime dateTimeSignIn = DateTime.Now; // 注意添加了SslMode参数,很多免费数据库需要SSL连接 string connectionstring = "Server=db4free.net;Port=3306;Database=mrcwebappdb;User Id=dbeditor;Password=Monster001359%;charset=utf8;SslMode=Required"; // 使用using语句自动释放连接资源 using (MySqlConnection con = new MySqlConnection(connectionstring)) { con.Open(); MySqlCommand cmd = new MySqlCommand(@" INSERT INTO visitormanagement( visitorName,visitorBadgeNumber,visitorRepresent, visitorToSee,visitorPurpose,visitorCitizenship, visitorClassification,visitorSignIn ) VALUES( @visitorName,@visitorBadgeNumber,@visitorRepresent, @visitorToSee,@visitorPurpose,@visitorCitizenship, @visitorClassification,@visitorSignIn )", con); // 补全所有参数 cmd.Parameters.AddWithValue("@visitorName", txtName.Text); cmd.Parameters.AddWithValue("@visitorBadgeNumber", badgeNum.ToString()); cmd.Parameters.AddWithValue("@visitorRepresent", txtRepresent.Text); cmd.Parameters.AddWithValue("@visitorToSee", txtToSee.Text); cmd.Parameters.AddWithValue("@visitorPurpose", txtPurpose.Text); cmd.Parameters.AddWithValue("@visitorCitizenship", citizenStatus); cmd.Parameters.AddWithValue("@visitorClassification", classification); // 确保日期格式和数据库的datetime字段兼容 cmd.Parameters.AddWithValue("@visitorSignIn", dateTimeSignIn.ToString("yyyy-MM-dd HH:mm:ss")); int rowsAffected = cmd.ExecuteNonQuery(); if (rowsAffected > 0) { // 数据插入成功,触发事件返回首页 nOnSignInComplete?.Invoke(this, new OnSignInEvenArgs( txtName.Text, txtRepresent.Text, txtToSee.Text, txtPurpose.Text, citizenStatus, classification)); Dismiss(); // 关闭登录Dialog } } } catch (MySqlException ex) { // 捕获数据库相关错误,方便排查 Toast.MakeText(Context, $"数据库错误: {ex.Message}", ToastLength.Long).Show(); } catch (System.Net.WebException ex) { // 捕获网络连接错误 Toast.MakeText(Context, $"网络连接错误: {ex.Message}", ToastLength.Long).Show(); } catch (Exception ex) { // 兜底捕获其他错误 Toast.MakeText(Context, $"未知错误: {ex.Message}", ToastLength.Long).Show(); } }
2. 远程MySQL连接的常见坑点
除了代码错误,远程连接数据库还有几个容易踩的坑:
Android应用网络权限:别忘了在
AndroidManifest.xml里添加INTERNET权限,否则应用连不上任何网络:<uses-permission android:name="android.permission.INTERNET" />MySQL用户远程访问权限:你的
dbeditor用户可能只被允许从localhost访问,需要登录数据库执行以下SQL授权远程访问:GRANT ALL PRIVILEGES ON mrcwebappdb.* TO 'dbeditor'@'%' IDENTIFIED BY 'Monster001359%'; FLUSH PRIVILEGES;这里的
%表示允许从任意IP访问,如果你想限制特定IP,可以把%换成你的设备公网IP。数据库服务器防火墙/安全组:db4free.net的3306端口可能没有开放给你的设备IP,需要登录db4free的管理后台,检查安全设置,把你的设备IP加入允许列表。
SSL连接要求:很多免费MySQL服务强制要求SSL连接,所以我在连接字符串里加了
SslMode=Required,如果还是不行,可以试试SslMode=None(但不推荐,不安全)。
按照上面的步骤调整后,应该能解决连接错误的问题,如果还有问题,看看Toast弹出的错误信息,能更精准地定位问题。
内容的提问来源于stack exchange,提问作者DiabolicNick

