如何在MySQL中获取列的平均值 及C#实现时类型转换报错解决
问题原因与修复方案
1. 修复SQL语法错误
你当前查询中sum('rating')对列名使用了单引号,SQL中单引号代表字符串常量,该语句实际是对固定字符串"rating"求和,完全无法得到正确的rating列汇总值,这也是你之前尝试AVG()函数运行失败的常见原因。如果需要对列名转义,请使用MySQL的反引号`。
2. 修复类型转换错误
MySQL的COUNT()、SUM()返回的整数结果在C#中对应的类型是System.Int64(long类型),不能直接强制转换为double,请使用Convert.ToDouble()方法做兼容转换,该方法支持将Int64类型安全转换为double。
3. 简化查询逻辑
无需分两次查询sum和count,直接使用MySQL原生AVG()函数一次查询即可得到平均值,还可以避免count为0时的除以0异常。
修复后的代码
public double GetRating(string username) { // 直接使用AVG函数查询,注意表名如果是用户输入一定要做SQL注入防护 string avgQuery = $"SELECT AVG(`rating`) FROM `{username}`"; using (MySqlConnection databaseConnection = new MySqlConnection(connectionString)) using (MySqlCommand avgCommand = new MySqlCommand(avgQuery, databaseConnection)) { try { databaseConnection.Open(); var result = avgCommand.ExecuteScalar(); // 处理表为空时AVG返回NULL的情况 return result == DBNull.Value ? 0d : Convert.ToDouble(result); } finally { databaseConnection.Close(); } } }
额外提示
直接将用户输入的username拼接进SQL语句存在SQL注入风险,如果username是外部可输入的参数,请提前做白名校验避免恶意注入。
内容的提问来源于stack exchange,提问作者Tom4045
相关产品推荐
相关产品推荐

