点击添加按钮无响应,如何正确实现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
相关产品推荐
相关产品推荐

