C# Visual Studio 2017中MySQL查询结果输出方法修正请求
修正你的MySQL查询方法并解决输出问题
我来帮你修正这个查询方法,同时解决返回结果无法正确输出的问题。先看看原代码里存在的几个关键问题,然后给出优化后的版本:
原代码的主要问题
- 使用非泛型的
ArrayList,缺乏类型安全性,调用时容易出现类型转换错误 catch块过于宽泛,没有捕获具体异常,也没有任何错误日志,出问题时根本不知道哪里错了- 没有正确释放
MySqlCommand和MySqlDataReader资源,虽然finally里关了连接,但手动管理资源容易遗漏 - 当查询结果为空时,直接访问
query[0]会抛出索引越界异常
修正后的完整代码
using System.Collections.Generic; using System.Windows.Forms; using MySql.Data.MySqlClient; public List<Dictionary<string, object>> P2a(string sql) { // 用泛型集合替代ArrayList,类型更安全 var result = new List<Dictionary<string, object>>(); // 替换为你的实际MySQL连接字符串 string connectionString = "server=你的服务器地址;user=用户名;password=密码;database=数据库名;"; // 使用using语句自动管理连接、命令、阅读器资源,无需手动关闭 using (MySqlConnection mysqlconnection = new MySqlConnection(connectionString)) using (MySqlCommand cmd = new MySqlCommand(sql, mysqlconnection)) { try { mysqlconnection.Open(); using (MySqlDataReader reader = cmd.ExecuteReader()) { while (reader.Read()) { var dict = new Dictionary<string, object>(); for (int count = 0; count < reader.FieldCount; count++) { // 处理数据库NULL值,转为C#的null更符合习惯 object value = reader.IsDBNull(count) ? null : reader[count]; dict.Add(reader.GetName(count), value); } result.Add(dict); } } } catch (MySqlException ex) { // 捕获MySQL相关异常,打印错误信息方便排查 MessageBox.Show($"数据库查询错误: {ex.Message}"); } catch (Exception ex) { // 捕获其他未知异常 MessageBox.Show($"未知错误: {ex.Message}"); } // using会自动关闭连接,不需要手动写finally块 } return result; }
关键改进点说明
- 泛型集合替代ArrayList:用
List<Dictionary<string, object>>代替ArrayList,调用时不需要强制转换,类型更安全,代码可读性更高 - 自动资源管理:所有实现
IDisposable的对象(连接、命令、阅读器)都用using包裹,确保在代码块结束时自动释放资源,避免内存泄漏 - 异常处理优化:捕获具体的
MySqlException和通用Exception,并给出明确的错误提示,方便你排查问题 - 处理DBNull值:添加了
reader.IsDBNull(count)的判断,避免将数据库中的NULL值直接存入字典(转为null更符合C#的习惯)
正确的调用示例
为了避免索引越界异常,调用时先判断是否有查询结果:
var query = P2a("select id,site,comment from sites"); if (query.Count > 0) { MessageBox.Show(query[0]["site"].ToString()); } else { MessageBox.Show("未查询到任何数据"); }
这样修改后,你的查询方法不仅能正确返回结果,还更健壮、易维护。
内容的提问来源于stack exchange,提问作者Ömer Özer
相关产品推荐
相关产品推荐

