SqlParameter设定的value值为0时、调用的存储过程获取到的值却为null解决方法
原C#代码如下:
1 if (query != null) 2 { 3 switch (query.MethodFlag) 4 { 5 //进出口退补税额统计表 6 case (int)EnumClassifyCorrectionRSTMethodFlags.CCRSTStatistial: 7 paras[0] = new SqlParameter("reportType", 0); 8 sqlWhere += "BASETYPE=0"; 9 break; 10 case (int)EnumClassifyCorrectionRSTMethodFlags.CCCustomDistrictStruct: 11 paras[0] = new SqlParameter("reportType", 2); 12 sqlWhere += "BASETYPE=2"; 13 break; 14 //环节 15 case (int)EnumClassifyCorrectionRSTMethodFlags.CCCorrectionStateStatistial: 16 paras[0] = new SqlParameter("reportType", 3); 17 sqlWhere += "BASETYPE=3"; 18 break; 19 //章节 20 case (int)EnumClassifyCorrectionRSTMethodFlags.CCCHAPTERStatistial: 21 paras[0] = new SqlParameter("reportType", 4); 22 sqlWhere += "BASETYPE=4"; 23 break; 24 //类 25 case (int)EnumClassifyCorrectionRSTMethodFlags.CCCATEGORYStatistial: 26 paras[0] = new SqlParameter("reportType", 5); 27 sqlWhere += "BASETYPE=5"; 28 break; 29 //大类 30 case (int)EnumClassifyCorrectionRSTMethodFlags.CCBIGCATEGORYStatistial: 31 paras[0] = new SqlParameter("reportType", 6); 32 sqlWhere += "BASETYPE=6"; 33 break; 34 case (int)EnumClassifyCorrectionRSTMethodFlags.CCAffiliatedCustomDistrictStruct: 35 paras[0] = new SqlParameter("reportType", 7); 36 sqlWhere += "BASETYPE=7"; 37 break; 38 default: 39 result = false; 40 break; 41 } 42 string strWhere = GetStrWhere(query, ref sqlWhere,ref monthCount); 43 44 45 46 paras[1] = new SqlParameter("strWhere", strWhere); 47 paras[2] = new SqlParameter("sqlWhere", sqlWhere ); 48 49 paras[3] = new SqlParameter("reportCount", Convert.ToInt32(monthCount)); 50 51 paras[4] = new SqlParameter("RecordCount", query.SumRecordsCount); 52 paras[4].Direction = ParameterDirection.Output;
在调用存储过程的时候发现int类型的参数paras[0]和paras[4]在赋给其值为0的情况下变成了null。
解决方案:
paras[0] = new SqlParameter("reportType", Convert.ToInt32(0));
paras[3] = new SqlParameter("reportCount", Convert.ToInt32(monthCount));
paras[4] = new SqlParameter("RecordCount", query.SumRecordsCount);//返回参数,可以为null,所以此处没做修改
paras[4].Direction = ParameterDirection.Output;
value 参数中指定 Object 时,SqlDbType 将从 Object 的 .NET Framework 类型推断出。
请小心使用 SqlParameter 构造函数的这个重载来指定整数参数值。因为此重载接受 Object 类型的 value,所以当此值为零时,必须将整数值转换为 Object 类型,如下面的 C# 示例所示。
Parameter = new SqlParameter("@pname", Convert.ToInt32(0));
如果不执行该转换,则编译器将认为您尝试调用 SqlParameter(string、 SqlDbType)构造函数重载。