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,提问作者Поляков Никита
相关产品推荐
相关产品推荐

