更换主机后MySQL代码出现System.ArgumentNullException错误求助
问题分析与解决方案
错误根源
你遇到的System.ArgumentNullException是因为调用BCrypt.Net.BCrypt.Verify时传入了null参数。具体场景是:当数据库查询不到符合条件的用户(比如用户名错误、HWID不匹配、不属于VIP组),ExecuteScalar()会返回null,此时hashedPassword变量为null,你直接将它传入Verify方法,就触发了这个异常。
另外原代码的条件判断逻辑混乱,!(hashedPassword is null && !BCrypt...)的写法完全错误,导致逻辑分支判断失效。
修复步骤与代码
1. 核心调整点
- 先判断查询结果是否为
null,避免传入null给Verify方法 - 扩大
try-catch范围,覆盖数据库连接、查询等所有可能出错的环节 - 修正密码验证的判断逻辑,让分支更清晰
2. 修复后的完整代码
private void button1_Click(object sender, EventArgs e) { try { string server = "72.167.59.139"; string database = "DATABASENAMEHERE"; string uid = "USERIDHERE"; string password = "PASSWORDHERE"; string ssl = "None"; string connectionString = $"SERVER={server};DATABASE={database};UID={uid};PASSWORD={password};SSL Mode={ssl};"; using var connection = new MySqlConnection(connectionString); connection.Open(); using var command = new MySqlCommand("SELECT members_pass_hash FROM core_members WHERE name = @name AND mgroup_others = 7 AND member_hwid = @hwid;", connection); command.Parameters.AddWithValue("@name", maskedTextBox1.Text); command.Parameters.AddWithValue("@hwid", HWIDNumber); var hashedPassword = command.ExecuteScalar() as string; // 先判断是否查询到匹配用户 if (hashedPassword == null) { MessageBox.Show("用户名错误、非VIP用户或HWID不匹配"); return; } // 验证密码是否正确 if (BCrypt.Net.BCrypt.Verify(maskedTextBox2.Text, hashedPassword)) { if (checkBox1.Checked) { // 注意:明文保存密码存在安全风险,建议改为保存哈希值或加密存储 Properties.Settings.Default.username = maskedTextBox1.Text; Properties.Settings.Default.password = maskedTextBox2.Text; Properties.Settings.Default.Save(); } var vip = new vipmember(); vip.Show(); HM(); } else { MessageBox.Show("密码错误"); } } catch (Exception ex) { MessageBox.Show($"错误信息: {ex.Message}\n错误详情: {ex.StackTrace}"); } }
额外建议
- 确认
HWIDNumber变量是否有有效值,避免查询条件中的HWID为null或空字符串 - 不要明文保存用户密码到
Properties.Settings,这是严重的安全隐患,建议保存密码的哈希值或者使用加密存储 - 可以在数据库操作前先检查
maskedTextBox1.Text和maskedTextBox2.Text是否为空,提前提示用户输入完整信息
内容的提问来源于stack exchange,提问作者Eric Brown
相关产品推荐
相关产品推荐

