使用C#和SQL Server删除数据行的方法失效问题求助
以下是导致rowsAffected为0(即未找到匹配记录)的常见原因及对应的排查/修复方案:
参数值与数据库记录不匹配
SQL Server若启用大小写区分的排序规则,或数据库中projectName字段的记录包含前后空格、特殊字符,而传入的projectNameDelete值未对应匹配,就会找不到目标记录。
排查方式:直接在SQL Server中执行测试语句验证:SELECT * FROM ProjectsClipBoardManager WHERE projectName = '你传入的测试值'若查询无结果,说明值不匹配,需核对传入值与数据库记录的一致性。
参数类型长度未正确设置
代码中使用SqlDbType.VarChar但未指定长度,默认可能仅保留1位长度,导致传入的长字符串被截断,无法匹配数据库中的完整记录。
修复方式:指定与数据库projectName字段一致的长度,比如字段为VARCHAR(100),则修改参数添加代码:cmd.Parameters.Add("@projectName", SqlDbType.VarChar, 100);数据库连接指向错误
Conectarbd对象可能连接了其他数据库(如测试库、备份库),而非存储目标数据的数据库。
排查方式:检查连接字符串中的Initial Catalog是否正确指向目标数据库,或临时添加代码输出当前连接的数据库名称进行验证。传入的参数值为空或无效
若调用DeleteProject时传入的projectNameDelete是空字符串、null,或是不存在的项目名称,自然无法找到对应记录。
排查方式:在方法开头添加调试代码,确认参数实际值:Debug.WriteLine($"要删除的项目名称:{projectNameDelete}");表名或字段名拼写错误
虽然SQL Server默认不区分标识符大小写,但如果表名/字段名实际拼写与SQL语句不一致(比如表名少写了s,或数据库开启了标识符大小写区分),也会导致匹配失败。
排查方式:核对数据库中的表名、字段名与SQL语句是否完全一致。
另外,代码存在一个潜在bug:else分支中重复调用了Conectarbd.Close(),但前面已经执行过一次连接关闭操作,这会触发InvalidOperationException(连接已关闭时再次执行关闭),需删除else块中的Conectarbd.Close()语句。
内容的提问来源于stack exchange,提问作者Alejandro Carvajal Ramírez

