C#删除SQL Server中DataGrid选中行遇SQL语法错误求助
三次报错核心原因
- 第一次报错原因:
- 拼写错误:
Gaz = =多写了一个等号 - 语法缺漏:
ÜrünNo = '"+ urunno +"'AND Güç拼接语句时闭合引号后没有加空格就直接跟AND关键字,SQL无法识别 - 传值错误:最后
[Not]= '"+ noz +"'错误把noz变量作为Not字段的值,应该用你定义的not变量 - 额外风险:字符串拼接SQL容易引发SQL注入,遇到带单引号的内容会直接触发语法错误
- 拼写错误:
- 第二次报错原因:
- SQL WHERE子句的多个筛选条件不能用逗号分隔,必须用AND/OR这类逻辑运算符连接
- DELETE语句标准语法是
DELETE FROM 表名,你这里漏写了FROM关键字
- 第三次报错原因:
完全不符合T-SQL语法规范,WHERE子句不能先列所有字段再用逗号对应值,LIKE是单字段匹配运算符,不能批量匹配多字段值。
修正后可用代码
private void VeriSİL() { // 先判断有没有选中行,避免空引用报错 if (cwGrid.CurrentRow == null || cwGrid.CurrentRow.IsNewRow) { MessageBox.Show("请先选中要删除的行"); return; } // 使用using自动释放连接和命令对象资源,替换成你自己的数据库连接字符串 using (SqlConnection baglan = new SqlConnection("你的数据库连接字符串")) { try { baglan.Open(); // 条件全部用AND连接,参数化写法避免注入和语法问题 string sql = @"DELETE FROM CW WHERE Beğeni = @bgn AND [1.Malz] = @m1 AND [2.Malz] = @m2 AND [3.Malz] = @m3 AND Kaynaktürü = @kturu AND [1/mm] = @m1m AND [2/mm] = @m2m AND [3/mm] = @m3m AND ÜrünNo = @urunno AND Güç = @guc AND Hız = @hiz AND Odak = @odk AND Gaz = @gaz AND Açı = @aci AND Nozzle = @noz AND Süre = @sur AND Foto = @foto AND [Not] = @not"; SqlCommand komut = new SqlCommand(sql, baglan); komut.Parameters.AddWithValue("@bgn", cwGrid.CurrentRow.Cells[0].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@m1", cwGrid.CurrentRow.Cells[1].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@m2", cwGrid.CurrentRow.Cells[2].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@m3", cwGrid.CurrentRow.Cells[3].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@kturu", cwGrid.CurrentRow.Cells[4].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@m1m", cwGrid.CurrentRow.Cells[5].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@m2m", cwGrid.CurrentRow.Cells[6].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@m3m", cwGrid.CurrentRow.Cells[7].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@urunno", cwGrid.CurrentRow.Cells[8].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@guc", cwGrid.CurrentRow.Cells[9].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@hiz", cwGrid.CurrentRow.Cells[10].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@odk", cwGrid.CurrentRow.Cells[11].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@gaz", cwGrid.CurrentRow.Cells[12].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@aci", cwGrid.CurrentRow.Cells[13].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@noz", cwGrid.CurrentRow.Cells[14].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@sur", cwGrid.CurrentRow.Cells[15].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@foto", cwGrid.CurrentRow.Cells[16].Value?.ToString() ?? DBNull.Value.ToString()); komut.Parameters.AddWithValue("@not", cwGrid.CurrentRow.Cells[17].Value?.ToString() ?? DBNull.Value.ToString()); komut.ExecuteNonQuery(); MessageBox.Show("Silme İşlemi Başarılı."); // 此处可添加DataGrid重新绑定数据源的代码,刷新显示最新数据 } catch (Exception ex) { MessageBox.Show("删除失败:" + ex.Message); } } } private void silButton_Click(object sender, EventArgs e) { VeriSİL(); }
优化建议
如果你的CW表有主键字段,完全不需要匹配所有字段作为删除条件,只用主键作为唯一筛选条件即可,逻辑更简单也不会出现误删同值其他行的问题。
内容的提问来源于stack exchange,提问作者user16741817
相关产品推荐
相关产品推荐

