问题解决:SqlParameterCollection只接受非空的SqlParameter类型对象,不接受SqlParameter[]对象

本文详细探讨了在.NET开发过程中遇到的SqlParameter传参问题,并通过实际案例解释了cmd.Parameters.Add与cmd.Parameters.AddRange的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

做.net个人版机房收费系统时,遇到了这样一个问题:

 

既然提到了SqlParameter,那就意味着设置参数处出现了问题,但是到底是哪里出了问题呢,之前运行的时候也没有出错呀,怎么现在又出现了这样的错误。仔细研究提示的错误:只接受非空的SqlParameter类型对象。也就是说我给函数传入的参数为空呗,但是自己的代码里明明传入了参数,怎么会提示传入的为空呢??那一定是没有传入成功;虽然调用的函数参数已对应“传入”,但是没有识别。

网上查了这个问题,但都不符合我的错误,但是可以看出他们错误的共同点,就是我上面所说的SqlParameter类型参数传入不成功。

最后发现了我的问题所在:以下是我的代码

SqlHelper中的一个函数:

 

D层的函数SelectUser_DA()调用以上SqlHelper中的函数Executescalar():

问题出在SelectUser_DA(ByVal enUser As UserEntity)在调用 Executescalar(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal paramete As SqlParameter())时,第三个参数没有传入,虽然在代码上看似传入了参数,但是在Executescalar()函数中并没有读入,问题在于我第一次写的添加参数的代码:cmd.Parameters.Add(paramete),之后改为 cmd.Parameters.AddRange(paramete),就正确了。

 

Why?

两个属性Add和AddRange的区别在哪里?

cmd.Parameters.Add():添加一个参数。增加多个参数时,需要使用一个Foreach循环;

cmd.Parameters.AddRange():添加一个参数的数组;

所以很明显了,我添加的是一个参数数组,所以用cmd.Parameters.Add()就出现错误了。

 

问题总结:细节决定成败,有时候学习还真的不能差不多,有时候研究很久,就差那么一点。

<think>我们正在解决SqlParameterCollectiononlyacceptsnon-nullSqlParametertypeobjects”错误。这个错误通常发生在尝试向SqlParameterCollection中添加null值或SqlParameter对象时。解决方案:1.检查每个添加到SqlParameterCollection的参数是否为SqlParameter类型为null。2.在添加参数前,确保参数已经正确实例化。示例代码:错误情况:尝试添加null或SqlParameter对象。正确做法:using(SqlCommandcmd=newSqlCommand(query,connection)){//正确创建SqlParameter对象SqlParameterparam1=newSqlParameter("@Param1",SqlDbType.Int);param1.Value=1;cmd.Parameters.Add(param1);//正确添加//错误:添加null//cmd.Parameters.Add(null);//这会引发异常//错误:添加SqlParameter对象//cmd.Parameters.Add(123);//这会引发异常}3.如果使用参数数组,遍历数组确保每个元素都是SqlParameter对象。另一种常见情况是在循环中添加参数,需要确保循环变量为null。4.如果使用参数数组,并动态创建参数,确保在添加前已经创建了SqlParameter实例。例如:List<SqlParameter>parameters=newList<SqlParameter>();//...动态创建多个参数foreach(varpinparameters){if(p==null)//检查null{thrownewException("发现null参数");}cmd.Parameters.Add(p);}5.使用AddWithValue方法时,注意它返回的是一个SqlParameter对象,但通常我们直接使用,会返回null,所以问题较少。但是,如果试图添加null到集合本身,还是会出错。6.使用参数化查询时,确保参数名称前面的@符号正确,并且参数已经创建。7.如果参数是从方法返回的,确保方法返回的是SqlParameter。8.如果使用第三方库生成参数,检查该库是否可能返回null。9.在调试时,可以设置断点检查添加到集合的每个参数。10.如果使用批量添加,例如AddRange,同样需要检查数组中是否有null。代码示例(AddRange):SqlParameter[]parameters=newSqlParameter[]{newSqlParameter("@p1",1),null,//这里会出错newSqlParameter("@p2",2)};cmd.Parameters.AddRange(parameters);//因为数组中有null,将抛出异常因此,在调用AddRange之前,需要确保数组中没有null。总结:该错误的根本原因是向SqlParameterCollection中添加了null或SqlParameter对象。通过检查每个参数,确保都是SqlParameter实例即可解决。相关问题:1.如何避免SQL注入攻击?2.SqlParameterCollection还有哪些常见的错误?3.如何使用SqlParameter进行批量操作?</think> ### SqlParameterCollection接受SqlParameter类型对象的错误解决方案 此错误通常在向SQL命令的参数集合中添加`SqlParameter`对象或`null`值时发生。以下是具体解决方案: **错误原因:** - 尝试添加`null`值到参数集合 - 添加了`SqlParameter`类型对象(如`string`、`int`等基础类型) - 使用`AddWithValue()`时传递了错误的值类型[^1] **解决方案:** #### 1. 确保使用正确的`SqlParameter`对象 ```csharp // 正确做法 SqlParameter param = new SqlParameter("@UserName", SqlDbType.NVarChar, 50); param.Value = "John"; command.Parameters.Add(param); // 显式创建SqlParameter对象 ``` #### 2. 避免直接添加值 ```csharp // 错误示例 command.Parameters.Add(null); // 触发错误 // 正确做法 if (paramValue != null) { command.Parameters.Add(new SqlParameter("@Param", paramValue)); } ``` #### 3. 正确使用`AddWithValue`方法 ```csharp // 错误:添加基础类型SqlParameter command.Parameters.Add(userName); // 错误!userName是string类型 // 正确:使用AddWithValue封装 command.Parameters.AddWithValue("@UserName", userName); // 自动创建SqlParameter ``` #### 4. 检查批量添加操作 当使用`AddRange()`时需验证数组内容: ```csharp SqlParameter[] paramsArray = new SqlParameter[] { new SqlParameter("@Id", 1), null // 包含null会导致错误 }; // 添加前过滤null值 command.Parameters.AddRange(paramsArray.Where(p => p != null).ToArray()); ``` #### 5. 使用参数化查询验证 ```csharp using (SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Id=@Id", connection)) { // 显式创建参数对象 SqlParameter idParam = new SqlParameter("@Id", SqlDbType.Int); idParam.Value = userId; cmd.Parameters.Add(idParam); // 安全添加 } ``` **调试建议:** - 使用断点检查`Parameters`集合中的元素类型 - 验证所有参数创建语句是否执行成功 - 在循环添加参数时添加`null`检查[^2]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值