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

C# WinForms点击按钮执行MySQL命令报错及功能实现求助

问题修复方案

用户需求与问题

  • btnSubmit_Click事件报错,提示MySQL语法错误
  • 需求:将文本框输入插入数据库,查询customer表的Cus_ID并插入Orders表,最终显示订单ID(Orders_ID)

问题排查

  1. SQL语法错误:所有INSERT语句的VALUES结尾多了冗余分号(比如VALUES('...';)),不符合MySQL语法规范
  2. 控件取值错误:txtCusName未取.Text属性,直接插入控件对象的字符串表示,而非用户输入内容
  3. 数量计算逻辑错误:直接拼接文本框内容再转int是字符串拼接(如输入1和2会得到"12"),而非数值相加
  4. 连接占用问题:DataReader未关闭时执行其他SQL操作,会因连接被独占报错
  5. 订单ID查询不可靠:通过Cus_ID查询Orders_ID可能返回多个结果,无法确保是刚创建的订单
  6. SQL注入风险:直接拼接字符串生成SQL,存在安全隐患

修正后的完整代码

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

namespace Project
{
    public partial class CoffeeMania : Form
    {
        public CoffeeMania()
        {
            InitializeComponent();
        }

        private void CoffeeMania_Load(object sender, EventArgs e)
        {
            cmbBranchArea.Items.Add("PJ");
            cmbBranchArea.Items.Add("KL");

            cmbCusGender.Items.Add("Male");
            cmbCusGender.Items.Add("Female");
        }

        private void btnSubmit_Click(object sender, EventArgs e)
        {
            string dburl = System.Configuration.ConfigurationManager.ConnectionStrings["dburl"].ConnectionString;
            // using自动释放连接,避免资源泄漏
            using (MySqlConnection conn = new MySqlConnection(dburl))
            {
                try
                {
                    // 修正数量计算:逐个转换数值后相加,兼容空输入
                    int qty = 0;
                    int.TryParse(txtAmericano.Text, out int americano);
                    int.TryParse(txtCappuccino.Text, out int cappuccino);
                    int.TryParse(txtMocha.Text, out int mocha);
                    int.TryParse(txtEspresso.Text, out int espresso);
                    int.TryParse(txtLatte.Text, out int latte);
                    qty = americano + cappuccino + mocha + espresso + latte;

                    conn.Open();

                    // 插入客户:参数化查询避免注入和语法错误
                    string insertCusSql = "INSERT INTO customer(Cus_Name, Cus_Gender, Cus_Phone) VALUES(@Name, @Gender, @Phone);";
                    using (MySqlCommand cusCmd = new MySqlCommand(insertCusSql, conn))
                    {
                        cusCmd.Parameters.AddWithValue("@Name", txtCusName.Text.Trim());
                        cusCmd.Parameters.AddWithValue("@Gender", cmbCusGender.SelectedItem?.ToString());
                        cusCmd.Parameters.AddWithValue("@Phone", txtCusPhone.Text.Trim());
                        cusCmd.ExecuteNonQuery();
                    }

                    // 获取刚插入的客户ID,用1424845最可靠
                    int cusId;
                    using (MySqlCommand getCusIdCmd = new MySqlCommand("SELECT 1424845;", conn))
                    {
                        cusId = Convert.ToInt32(getCusIdCmd.ExecuteScalar());
                    }

                    // 插入订单
                    string insertOrderSql = "INSERT INTO orders(Orders_Qty, Cus_ID, Branch_ID) VALUES(@Qty, @CusId, @BranchId);";
                    using (MySqlCommand orderCmd = new MySqlCommand(insertOrderSql, conn))
                    {
                        orderCmd.Parameters.AddWithValue("@Qty", qty);
                        orderCmd.Parameters.AddWithValue("@CusId", cusId);
                        orderCmd.Parameters.AddWithValue("@BranchId", cmbBranchArea.SelectedItem?.ToString());
                        orderCmd.ExecuteNonQuery();
                    }

                    // 获取刚插入的订单ID
                    int orderId;
                    using (MySqlCommand getOrderIdCmd = new MySqlCommand("SELECT 1424845;", conn))
                    {
                        orderId = Convert.ToInt32(getOrderIdCmd.ExecuteScalar());
                    }

                    MessageBox.Show($"Your Order ID is: {orderId}");
                    lblShowVoteResult.Text = "Successfully submitted";
                }
                catch (MySqlException ex)
                {
                    MessageBox.Show($"数据库错误:{ex.Message}");
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"系统错误:{ex.Message}");
                }
            }
        }
    }
}

关键优化点

  • 用using语句管理数据库连接和命令,自动释放资源,无需手动关闭/销毁
  • 用int.TryParse处理文本框空输入,避免转换失败崩溃
  • 用1424845获取刚插入的ID,确保结果唯一可靠
  • 参数化查询彻底解决SQL注入风险,同时避免字符串拼接导致的语法错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:45:30