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)构造函数重载。

posted on 2015-09-16 10:07  小呀么小二郎  阅读(254)  评论(0编辑  收藏  举报

导航