使用C#操作Microsoft SQL Server时删除更新表数据失效问题
问题核心原因
你遇到的删除不生效问题根源是SQL语法写法完全错误,同时现有代码存在多个隐患:
- SQL Server的
DELETE语句没有VALUES子句,你写的删除语句语义和预期完全不符:执行时不会匹配你传入的文本框值作为删除条件,最终匹配不到任何待删除行,因此无报错但0行数据被删除 - 你写的插入、删除SQL末尾都多了冗余逗号,插入语句能执行仅为部分SQL Server版本兼容了非标准写法,不属于规范语法
- 采用字符串拼接方式生成SQL存在严重SQL注入风险,输入内容包含单引号时会直接触发SQL语法错误
- 未判断
ExecuteNonQuery()的返回值:该方法会返回操作实际影响的行数,可直接判断增删改操作是否生效
正确实现方式
SQL Server中三类基础写操作的标准语法如下,注意删除、更新必须带WHERE条件指定匹配规则,漏写会直接操作整张表所有数据:
- 插入:
INSERT INTO 表名(字段1,字段2,字段3) VALUES (@参数1,@参数2,@参数3) - 删除:
DELETE FROM 表名 WHERE 字段1=@参数1 AND 字段2=@参数2 AND 字段3=@参数3 - 更新:
UPDATE 表名 SET 字段1=@新值1,字段2=@新值2 WHERE 匹配字段=@匹配值
C#操作时全程用参数化查询,不要拼接字符串,同时用using块自动释放数据库连接资源,不需要手动调用Close()方法。
删除功能示例代码
// 替换为你自己的数据库连接字符串 using (SqlConnection con = new SqlConnection("你的数据库连接字符串")) { con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; // 把Col1/Col2/Col3替换为你表中实际对应的字段名 cmd.CommandText = "DELETE FROM MyTable WHERE Col1 = @Col1 AND Col2 = @Col2 AND Col3 = @Col3"; // 根据字段实际类型调整SqlDbType枚举值,字符串类型建议指定长度 cmd.Parameters.Add("@Col1", SqlDbType.NVarChar, 50).Value = textBox1.Text; cmd.Parameters.Add("@Col2", SqlDbType.NVarChar, 50).Value = textBox2.Text; cmd.Parameters.Add("@Col3", SqlDbType.NVarChar, 50).Value = textBox3.Text; int affectedRows = cmd.ExecuteNonQuery(); MessageBox.Show(affectedRows > 0 ? $"成功删除{affectedRows}条数据" : "未匹配到符合条件的可删除数据"); }
更新功能示例代码
using (SqlConnection con = new SqlConnection("你的数据库连接字符串")) { con.Open(); SqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; // 示例逻辑:以Col1为匹配条件,更新对应行的Col2、Col3字段值,按你的实际业务调整 cmd.CommandText = "UPDATE MyTable SET Col2 = @Col2, Col3 = @Col3 WHERE Col1 = @Col1"; cmd.Parameters.Add("@Col1", SqlDbType.NVarChar, 50).Value = textBox1.Text; cmd.Parameters.Add("@Col2", SqlDbType.NVarChar, 50).Value = textBox2.Text; cmd.Parameters.Add("@Col3", SqlDbType.NVarChar, 50).Value = textBox3.Text; int affectedRows = cmd.ExecuteNonQuery(); MessageBox.Show(affectedRows > 0 ? $"成功更新{affectedRows}条数据" : "未匹配到符合条件的可更新数据"); }
注意事项
- 所有实现了
IDisposable接口的数据库相关对象(SqlConnection、SqlCommand等)都建议放在using块中,退出代码块时会自动释放资源,避免连接泄漏 - 生产环境执行删除、更新操作前,建议先开启事务,确认影响行数符合预期后再提交,避免误操作全表数据
- 参数化查询是C#操作SQL Server的标准实践,可完全避免SQL注入风险,同时自动处理特殊字符转义问题,不要为了省事用字符串拼接SQL
内容的提问来源于stack exchange,提问作者Tensora
相关产品推荐
相关产品推荐

