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

C#操作MySQL更新数据报Parameter '@Unique ID'已声明错误求助

问题根因与修复方案

核心问题说明

  • 首次点击不更新:UPDATE语句中所有参数占位符都包裹了单引号,会被MySQL识别为普通字符串常量,而不是绑定参数的占位符。相当于执行的是把Unique ID设为字符串@Unique ID,同时WHERE条件也匹配这个固定字符串,自然找不到对应记录,也不会更新任何数据,执行不报错所以弹出了Done提示。
  • 第二次点击报参数重复声明:代码中定义局部Command对象时写的是MySqlCommand sqlcmd = new MySqlCommand();(小写c的cmd),后续操作实际用的是全局变量sqlCmd(大写C的Cmd)。每次点击事件都会往同一个全局Command对象的参数集合里添加同名参数,第一次加完没有清空,第二次再加就触发重复声明错误。另外全局连接对象如果出现异常没走到Close逻辑,还会引发连接泄漏问题。

修复后的完整代码

private void btn_Update_Click(object sender, EventArgs e)
{
    string connStr = $"Server = {server};user Id = {username};password = {password};database = {database}";
    string gen = rb_male.Checked ? "Male" : "Female";
    try
    {
        // 每次操作新建连接和Command,用using自动释放资源,无需手动Close
        using (MySqlConnection sqlConn = new MySqlConnection(connStr))
        using (MySqlCommand sqlCmd = new MySqlCommand())
        {
            sqlConn.Open();
            sqlCmd.Connection = sqlConn;
            // 移除参数占位符外面的所有单引号
            sqlCmd.CommandText = @"Update `monthly_expense`.`exp_mast` 
                                set `Unique ID`= @Unique ID, 
                                    `First Name`= @First Name,
                                    `Last Name`= @Last Name,
                                    `Address`= @Address,
                                    `Contact Number`= @Contact Number,
                                    `Alternate Contact Number`= @Alt Number,
                                    `Gender`= @gen 
                                Where `Unique ID`= @Unique ID";
            sqlCmd.CommandType = CommandType.Text;
            sqlCmd.Parameters.AddWithValue("@Unique ID", txt_id.Text);
            sqlCmd.Parameters.AddWithValue("@First Name", txt_fstn.Text);
            sqlCmd.Parameters.AddWithValue("@Last Name", txt_lstn.Text);
            sqlCmd.Parameters.AddWithValue("@Address", txt_loc.Text);
            sqlCmd.Parameters.AddWithValue("@Contact Number", txt_cont.Text);
            sqlCmd.Parameters.AddWithValue("@Alt Number", txt_altcont.Text);
            sqlCmd.Parameters.AddWithValue("@gen", gen);

            int affectedRows = sqlCmd.ExecuteNonQuery();
            if (affectedRows > 0)
            {
                MessageBox.Show("Done");
            }
            else
            {
                MessageBox.Show("未找到匹配的记录,无数据更新");
            }
        }
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

额外优化建议

  • 不要复用全局的数据库连接和Command对象,ADO.NET已经内置了连接池机制,每次新建连接的开销极低,复用全局对象反而容易引发各种资源未释放、状态残留问题。
  • 参数名建议不要带空格,改为@UniqueId这类格式,避免不必要的解析错误。

内容的提问来源于stack exchange,提问作者Supayan Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:21:01