C# WinForms点击按钮执行MySQL命令报错及功能实现求助
问题修复方案
用户需求与问题
- btnSubmit_Click事件报错,提示MySQL语法错误
- 需求:将文本框输入插入数据库,查询customer表的Cus_ID并插入Orders表,最终显示订单ID(Orders_ID)
问题排查
- SQL语法错误:所有INSERT语句的
VALUES结尾多了冗余分号(比如VALUES('...';)),不符合MySQL语法规范 - 控件取值错误:
txtCusName未取.Text属性,直接插入控件对象的字符串表示,而非用户输入内容 - 数量计算逻辑错误:直接拼接文本框内容再转int是字符串拼接(如输入1和2会得到"12"),而非数值相加
- 连接占用问题:DataReader未关闭时执行其他SQL操作,会因连接被独占报错
- 订单ID查询不可靠:通过
Cus_ID查询Orders_ID可能返回多个结果,无法确保是刚创建的订单 - 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
相关产品推荐
相关产品推荐

