【.net/.net core】【报错处理】另一个 SqlParameterCollection 中已包含 SqlParameter。

错误场景:使用同名参数在两个SQL句柄中使用参数化查询

cs 复制代码
SqlCommand cmd1 = new SqlCommand("SELECT * FROM User WHERE ID = @UserID", conn);
cmd1.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int) { Value = 100 });

SqlCommand cmd2 = new SqlCommand("UPDATE User SET Age = 20 WHERE ID = @UserID", conn);
cmd2.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int) { Value = 100 });

解决方案:

1.清空参数

cs 复制代码
SqlCommand cmd = new SqlCommand("", conn);
// 第一次使用
cmd.CommandText = "SELECT * FROM User WHERE ID = @UserID";
cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int) { Value = 100 });
cmd.ExecuteReader();

// 第二次使用(未清空参数)
cmd.CommandText = "SELECT * FROM Order WHERE UserID = @UserID";
cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int) { Value = 100 }); // ❌ 重复添加同名参数(虽不是同一个实例,但也会报错"已包含名为@UserID的参数")

// 正确写法:先清空参数
cmd.Parameters.Clear(); // ✅ 清空原有参数
cmd.CommandText = "SELECT * FROM Order WHERE UserID = @UserID";
cmd.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int) { Value = 100 });
cmd.ExecuteReader();

2.使用不同名参数进行参数化查询

相关推荐
消失的旧时光-19439 小时前
Spring Boot 工程化进阶:统一返回 + 全局异常 + AOP 通用工具包
java·spring boot·后端·aop·自定义注解
NE_STOP10 小时前
Redis--发布订阅命令和Redis事务
java
PAC_3Dame10 小时前
记一次真实的线上OOM
java
SunnyDays101110 小时前
如何在Java中将Word文档转换为图像(JPEG、PNG或SVG)
java
Lumos_77710 小时前
Linux -- 线程
java·jvm·算法
知兀10 小时前
【MybatisPlus】后端用枚举类,数据库用tinyint,存在枚举类型转换
java
StockTV10 小时前
印度股票实时数据 NSE和BSE的实时行情、K 线及指数数据
java·开发语言·spring boot·python
User_芊芊君子11 小时前
【OpenAI 把 AI 玩明白了】:自主推理 + 动态知识图谱,这 4 个技术突破要颠覆行业
java·人工智能·知识图谱
c++之路11 小时前
C++20概述
java·开发语言·c++20
Championship.23.2411 小时前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试