在写一个相册的网站时,出现了如题所述的错误,其中对“@scanType”参数进行赋值的源代码如下:
SqlParameter para = new SqlParameter("@scanType", (int)ScanType.所有人);
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的方法,而不应该使用强制类型转换!