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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:09:28