You need to enable JavaScript to run this app. 点击添加按钮无响应,如何正确实现DataGridView单元格值插入SQL表?
优惠活动
大模型
产品
解决方案
定价
更多

点击添加按钮无响应,如何正确实现DataGridView单元格值插入SQL表?

问题根因定位

点击按钮无响应是代码存在多处逻辑错误共同导致的,具体问题:

  • 循环判断条件完全失效:原代码写的if (mainTable.Rows[i].Cells[0] != null) { continue; }没有实际筛选作用,DataGridView的单元格对象在控件初始化完成后就始终存在,哪怕单元格值为空也不会为null,这会导致循环每一次迭代都直接触发continue,根本执行不到插入数据库的代码段。
  • 循环索引偏移越界:就算判断逻辑通过,代码取单元格值时用了Rows[i-1]的错位索引,第一次循环i=0时就会触发索引越界异常。WinForm事件中未捕获的异常通常不会弹出明显提示,对外表现就是点击按钮毫无反应。
  • 连接字符串格式错误:原代码里写的Initial Catalog='Student Automation DB'给数据库名额外加了单引号,会导致连接时无法匹配到正确的数据库实例,触发连接异常。
  • 字符串拼接SQL的隐患:直接把单元格值拼接到INSERT语句里,遇到内容包含单引号、特殊字符时会直接触发SQL语法错误,同时存在SQL注入风险。
  • 资源管理不规范:在循环内反复开关数据库连接,容易造成连接泄漏、查询性能低下。
  • 未跳过DGV占位空行:DataGridView最后一行是系统预留的用户输入占位行,不跳过的话会把空值强行插入数据库,触发字段非空约束报错。
修正后的实现代码
private void add_Click(object sender, EventArgs e)
{
    //  修正连接字符串:去掉库名外围多余的单引号,用using块自动释放连接资源
    string connStr = @"Data Source=CANER\SQLEXPRESS;Initial Catalog=Student Automation DB;Integrated Security=True";
    
    using (SqlConnection con = new SqlConnection(connStr))
    {
        //  整轮循环只打开一次连接,避免反复开关的性能损耗
        con.Open();

        //  遍历行时排除最后一个系统预留的新增占位行
        for (int i = 0; i < mainTable.Rows.Count - 1; i++)
        {
            //  跳过完全没有输入内容的空行
            if (mainTable.Rows[i].Cells[0].Value == null ||
                string.IsNullOrWhiteSpace(mainTable.Rows[i].Cells[0].Value.ToString()))
            {
                continue;
            }

            //  用参数化查询替代字符串拼接,规避语法错误和注入风险
            string insertSql = @"INSERT INTO students 
                                (匹配表实际列1, 匹配表实际列2, 匹配表实际列3, 匹配表实际列4, 匹配表实际列5, 匹配表实际列6) 
                                VALUES (@col0, @col1, @col2, @col3, @col4, @col5)";
            
            using (SqlCommand cmd = new SqlCommand(insertSql, con))
            {
                //  逐列匹配DGV中的单元格值给参数赋值
                cmd.Parameters.AddWithValue("@col0", mainTable.Rows[i].Cells[0].Value);
                cmd.Parameters.AddWithValue("@col1", mainTable.Rows[i].Cells[1].Value);
                cmd.Parameters.AddWithValue("@col2", mainTable.Rows[i].Cells[2].Value);
                cmd.Parameters.AddWithValue("@col3", mainTable.Rows[i].Cells[3].Value);
                cmd.Parameters.AddWithValue("@col4", mainTable.Rows[i].Cells[4].Value);
                cmd.Parameters.AddWithValue("@col5", mainTable.Rows[i].Cells[5].Value);

                cmd.ExecuteNonQuery();
            }
        }
    }
    
    //  插入完成后给出明确操作反馈
    MessageBox.Show("DGV数据已全部插入到数据库");
}

注意:代码中INSERT语句的列名需要替换成你数据库中students表实际的字段名,不要直接依赖默认的全值位置插入,避免列顺序不匹配导致的插入错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 04:24:04