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

C# WinForms(.NET Framework)操作SQL无响应且未写入数据求助

问题分析与修复:Windows Forms物品出库功能无响应且未修改数据

核心问题排查

你的代码存在几个关键错误,导致程序无响应且未执行数据修改:

  1. 查询条件错误
    你用comboBox2.SelectedIndex(整数索引)作为ÜrünAdi(字符串类型的物品名称)的查询条件,这会导致SQL查询不到任何匹配数据,dr.Read()循环不会执行,自然不会调用ÜrünÇıkışı()方法。

  2. 数据类型不匹配
    数据库中ToplamÜrün和Limit是REAL浮点类型,但你用dr.GetInt32()读取,会触发类型转换异常,未处理的异常会导致程序卡住。

  3. 冗余的对象初始化
    重复初始化SqlConnection和SqlCommand对象,不仅冗余,还可能导致资源泄漏。

  4. SQL注入风险+字符串拼接错误
    直接拼接字符串生成SQL语句,既不安全,也容易因格式问题导致查询失败。

  5. 未处理异常与资源泄漏
    没有异常捕获机制,数据库连接未确保关闭,一旦出错会导致程序无响应。


修复后的代码

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ş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:06:23