C#连接MySQL获取COUNT值异常,需依据结果展示对应图片
解决MySQL COUNT值获取与展示逻辑问题
问题背景
需根据MySQL查询返回的COUNT值执行对应逻辑:
- COUNT为0:不执行任何操作
- COUNT等于1:展示指定图片
- COUNT大于1:展示另一张图片
当前问题:尝试MySqlDataReader、ExecuteScalar等方法无法正确获取对应行数,使用他人代码后结果始终为6(实际查询返回6行,但需要的是每个idevent对应的独立COUNT值)
原代码存在的问题
- SQL语句错误:
INNER JOIN event未指定连接条件,会生成笛卡尔积,导致COUNT结果完全错误- 表名拼写不一致:SQL中同时出现
event和evento,属于笔误
- 未正确读取COUNT数值:仅用
reader.HasRows判断是否有结果,无法获取COUNT的具体值 - 资源未正确释放:数据库连接、命令、Reader未使用
using语句,会导致资源泄漏 - 逻辑错误:循环中重复添加
PatientColumn列,会造成DataGridView列重复
修正后的代码
private void patient() { if (OpenEventMissionData.Rows.Count == 0) return; // 复用数据库连接,避免循环内重复创建 string connStr = ConfigurationManager.ConnectionStrings["dbx"].ConnectionString; using (MySqlConnection connection = new MySqlConnection(connStr)) { connection.Open(); // 参数化SQL,防止注入并修正连接条件、表名拼写 string sql = @"SELECT COUNT(*) FROM patient INNER JOIN evento ON patient.ID_EVENT = evento.ID_EVENT WHERE patient.ID_EVENT = @idevent AND evento.EVENT_OPEN = 1;"; using (MySqlCommand cmd = new MySqlCommand(sql, connection)) { foreach (DataGridViewRow row in OpenEventMissionData.Rows) { if (row.Cells[1].Value == null) continue; string idevent = row.Cells[1].Value.ToString(); cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("@idevent", idevent); // 用ExecuteScalar直接获取COUNT值 object result = cmd.ExecuteScalar(); if (result != DBNull.Value && int.TryParse(result.ToString(), out int count)) { // 根据COUNT值执行对应逻辑 if (count == 1) { // 展示第一张图片的逻辑,示例: // row.Cells["ImageColumn"].Value = Image.FromFile("path/to/image1.png"); } else if (count > 1) { // 展示第二张图片的逻辑,示例: // row.Cells["ImageColumn"].Value = Image.FromFile("path/to/image2.png"); } // count为0时不执行操作 } } } } }
关键说明
- 参数化查询:避免SQL注入,同时解决字符串拼接带来的语法问题
- ExecuteScalar:专门用于获取单行单列的结果,比
ExecuteReader更高效直接 - using语句:自动释放数据库连接、命令等资源,避免泄漏
- 修正SQL连接:添加
INNER JOIN的连接条件,修正表名拼写错误,确保查询结果准确
内容的提问来源于stack exchange,提问作者sup3r93
相关产品推荐
相关产品推荐

