“参数化查询@scanType需要参数 ,但未提供该参数”错误产生的一个原因

本文介绍了一种在使用SqlParameter对枚举类型进行赋值时遇到的问题及解决方法。当使用枚举值直接赋值给SqlParameter时,由于SqlParameter的重载方法导致编译器误判类型,解决方式是使用Convert.ToInt32进行转换。

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

  在写一个相册的网站时,出现了如题所述的错误,其中对“@scanType”参数进行赋值的源代码如下:

  SqlParameter para = new SqlParameter("@scanType", (int)ScanType.所有人);

  ScanType为枚举,定义如下:

public enum ScanType
    {
        所有人,
        仅自己,
        仅好友,
    }

  public enum ScanType    
  {
          所有人, 
          仅自己,
          仅好友, 
  }

  经过仔细查找错误发现:SqlParameter函数有多个重载,其中有两个参数的重载有两个方法,分别为:public SqlParameter(string parameterName, object value)和public SqlParameter(string parameterName, SqlDbType dbType),这里相差的就是后面那个参数的类型不同,而如果使用上面的方法对“@scanType”参数进行赋值的话系统会认为是后面那个重载,就是认为“(int)ScanType.所有人”是SqlDbType类型的,而不是我们所要的。

  通过上面的发现,我将传的后面那个参数改为“Convert.ToInt32(ScanType.所有人)”这时就正常了,系统识别了这个参数,并调用了正确的方法(public SqlParameter(string parameterName, object value))。这可能是vs的一个bug吧,对于枚举类型的值作为参数化查询的参数时,应当使用Convert的方法,而不应该使用强制类型转换!

转载于:https://www.cnblogs.com/steel1990/archive/2010/04/12/steel1990_SqlParameter.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值