MySQL数据库member_hwid列空值检查异常:C#代码始终返回非空
问题分析与代码修正
核心错误点
- SQL语句逻辑错误:原语句中
AND优先级高于OR,导致member_hwid = ''的判断会脱离name = @name的约束,匹配所有空字符串的用户,而非指定name的用户。需要将member_hwid IS NULL OR member_hwid = ''用括号包裹,确保逻辑为name匹配 且 (HWID为空或空字符串)。 - 错误使用数据库方法:
ExecuteNonQuery()是用来执行增/删/改语句的,返回受影响的行数(int类型),永远不可能为null。你需要查询数据,应该用ExecuteScalar()来获取查询结果的第一行第一列值。 - 空值判断失效:由于
ExecuteNonQuery()返回int,hwid == null的判断永远不会成立,所以始终进入Not null分支。
修正后的代码示例
方式1:直接获取HWID值判断
public void CHECKANDWRITEHWID() { string server = "72.167.59.139"; string database = "DATABASENAME"; string uid = "YOURUID"; string password = "YOURPASSWORD"; string ssl = "None"; string connectionString = $"SERVER={server};DATABASE={database};UID={uid};PASSWORD={password};SSL Mode={ssl};"; using var connection = new MySqlConnection(connectionString); connection.Open(); // 修正SQL逻辑,用括号包裹OR条件 using var command = new MySqlCommand("SELECT member_hwid FROM core_members WHERE name = @name AND (member_hwid IS NULL OR member_hwid = '');", connection); command.Parameters.AddWithValue("@name", maskedTextBox1.Text); // 用ExecuteScalar获取查询结果 var hwidResult = command.ExecuteScalar(); // 判断HWID是否为空或空字符串 if (hwidResult == null || string.IsNullOrEmpty(hwidResult.ToString())) { MessageBox.Show("HWID为空,执行更新逻辑"); // 这里调用你的更新HWID函数 } else { MessageBox.Show("HWID已存在,执行登录逻辑"); // 这里调用你的登录逻辑 } }
方式2:高效判断是否需要更新(推荐)
直接查询是否存在符合条件的记录,避免返回不必要的数据:
public void CHECKANDWRITEHWID() { string server = "72.167.59.139"; string database = "DATABASENAME"; string uid = "YOURUID"; string password = "YOURPASSWORD"; string ssl = "None"; string connectionString = $"SERVER={server};DATABASE={database};UID={uid};PASSWORD={password};SSL Mode={ssl};"; using var connection = new MySqlConnection(connectionString); connection.Open(); // 使用EXISTS判断是否存在目标记录,性能更优 using var command = new MySqlCommand("SELECT EXISTS(SELECT 1 FROM core_members WHERE name = @name AND (member_hwid IS NULL OR member_hwid = ''));", connection); command.Parameters.AddWithValue("@name", maskedTextBox1.Text); // 转换结果:1表示存在(需要更新),0表示不存在(执行登录) int needUpdate = Convert.ToInt32(command.ExecuteScalar()); if (needUpdate == 1) { MessageBox.Show("HWID为空,执行更新逻辑"); // 调用更新HWID函数 } else { MessageBox.Show("HWID已存在,执行登录逻辑"); // 调用登录逻辑 } }
内容的提问来源于stack exchange,提问作者The Guild Of ASMR
相关产品推荐
相关产品推荐

