C# WinForms(.NET Framework)操作SQL无响应且未写入数据求助
问题分析与修复:Windows Forms物品出库功能无响应且未修改数据
核心问题排查
你的代码存在几个关键错误,导致程序无响应且未执行数据修改:
查询条件错误
你用comboBox2.SelectedIndex(整数索引)作为ÜrünAdi(字符串类型的物品名称)的查询条件,这会导致SQL查询不到任何匹配数据,dr.Read()循环不会执行,自然不会调用ÜrünÇıkışı()方法。数据类型不匹配
数据库中ToplamÜrün和Limit是REAL浮点类型,但你用dr.GetInt32()读取,会触发类型转换异常,未处理的异常会导致程序卡住。冗余的对象初始化
重复初始化SqlConnection和SqlCommand对象,不仅冗余,还可能导致资源泄漏。SQL注入风险+字符串拼接错误
直接拼接字符串生成SQL语句,既不安全,也容易因格式问题导致查询失败。未处理异常与资源泄漏
没有异常捕获机制,数据库连接未确保关闭,一旦出错会导致程序无响应。
修复后的代码
private void button2_Click(object sender, EventArgs e) { // 确保ComboBox选中了有效项 if (comboBox2.SelectedItem == null) { MessageBox.Show("请选择要出库的物品"); return; } string urunAdi = comboBox2.SelectedItem.ToString(); string connectionString = "server=(localdb)\\MSSQLLocalDB; Initial Catalog=SarfDepo;Integrated Security=true"; // 使用using语句自动释放数据库资源 using (SqlConnection con = new SqlConnection(connectionString)) { try { con.Open(); // 参数化查询,避免SQL注入,同时保证类型正确 string query = @"SELECT SUM(ToplamÜrün) AS toplam, AVG(Limit) AS limit FROM SarfDepoSayim WHERE ÜrünAdi = @UrunAdi GROUP BY ÜrünAdi"; using (SqlCommand cmd = new SqlCommand(query, con)) { cmd.Parameters.AddWithValue("@UrunAdi", urunAdi); using (SqlDataReader dr = cmd.ExecuteReader()) { if (dr.Read()) { // 处理可能的DBNull值,避免读取失败 double toplamUrun = dr.IsDBNull(0) ? 0 : dr.GetDouble(0); double limit = dr.IsDBNull(1) ? 0 : dr.GetDouble(1); if (toplamUrun <= limit) { MessageBox.Show("物品已低于设定库存限制,请及时补货"); } // 无论是否低于限制,都执行出库操作 ÜrünÇıkışı(); } else { MessageBox.Show("未找到该物品的库存记录"); } } } } catch (Exception ex) { MessageBox.Show("操作出错:" + ex.Message); } // using块会自动关闭连接,无需手动调用con.Close() } }
额外注意事项
- 检查
ÜrünÇıkışı()方法:确保该方法内的数据库操作同样使用参数化查询,且正确更新ToplamÜrün或相关字段,否则即使调用了方法也不会修改数据。 - 数据库字段优化:
GirisTarihi和CikisTarihi建议使用DATE或DATETIME类型,而非VARCHAR,便于日期相关的查询和计算。
内容的提问来源于stack exchange,提问作者Mustafa Bektaş
相关产品推荐
相关产品推荐

