You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForms执行MySql数据插入报Connection must be valid and open错误

C# WinForms MySQL插入操作报"Connection must be valid and open"修复

报错核心原因

按钮点击事件中的MySqlCommand实例未关联已打开的数据库连接对象,执行命令时无法找到有效、已打开的连接,直接触发该错误。

代码中存在的其他问题

  • 插入语句使用了SQL Server专属的方括号[]包裹表名、字段名,MySQL不支持该语法,需使用反引号`包裹标识符
  • 直接拼接用户输入内容生成SQL语句,存在SQL注入风险,特殊字符输入也会导致SQL语法报错
  • 插入完成后未刷新DataGridView数据源,新增数据无法实时显示在表格中
  • 多余引入了SQL Server驱动System.Data.SqlClient,和当前使用的MySQL场景不匹配,易造成类型混淆
  • 每次查询旅游人员列表时未清空原有表数据,重复加载会出现数据重复行问题

修复后的完整代码

using System;
using System.Data;
using System.Windows.Forms;
using System.Configuration;
using MySql.Data.MySqlClient;

namespace Курсовая.Приложение
{
    public partial class ProfileForm : Form
    {
        public ProfileForm()
        {
            InitializeComponent();
        }
        private void ProfileForm_Load(object sender, EventArgs e)
        {
            TouristGridView.DataSource = GetTouristList();
        }
        private DataTable dtTourist = new DataTable();
        private DataTable GetTouristList()
        {
            dtTourist.Clear();
            string connString = ConfigurationManager.ConnectionStrings["dbx"].ConnectionString;
            using (MySqlConnection con = new MySqlConnection(connString))
            {
                using (MySqlCommand cmd = new MySqlCommand("SELECT FIO, dob, phone FROM tourist", con))
                {
                    con.Open();
                    MySqlDataReader reader = cmd.ExecuteReader();
                    dtTourist.Load(reader);
                }
            }
            return dtTourist;
        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            string connString = ConfigurationManager.ConnectionStrings["dbx"].ConnectionString;
            using (MySqlConnection con = new MySqlConnection(connString))
            {
                con.Open();
                // 绑定已打开的连接对象,替换语法为MySQL兼容格式,改用参数化查询
                MySqlCommand Command = new MySqlCommand("INSERT INTO `tourist` (`FIO`, `dob`, `phone`) VALUES (@fio, @dob, @phone)", con);
                // 为参数赋值
                Command.Parameters.AddWithValue("@fio", NametextBox.Text.Trim());
                Command.Parameters.AddWithValue("@dob", dobDate.Value);
                Command.Parameters.AddWithValue("@phone", PhonetextBox.Text.Trim());
                
                Command.ExecuteNonQuery();
            }
            // 插入完成后重新加载数据,刷新表格显示
            TouristGridView.DataSource = GetTouristList();
        }
    }
}

关键修复点说明

  • 初始化MySqlCommand时必须传入连接对象作为第二个参数,将命令和已打开的连接做绑定,否则命令执行时无可用连接
  • 所有数据库操作优先使用参数化查询,禁止直接拼接用户输入内容,避免SQL注入和特殊字符导致的语法错误
  • 数据增删改操作完成后,需要重新查询数据源绑定到控件,才能展示最新的数据结果
  • 不同数据库的驱动、SQL语法存在差异,使用MySQL时不要引入SQL Server的相关依赖,避免语法、类型混淆

内容的提问来源于stack exchange,提问作者Поляков Никита

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:27:42