日期:2014-05-18 浏览次数:21456 次
public static int ReturnCount(Entity.WeaponInfo ReturnCount,string type)
{
SqlConnection conn = new SqlConnection("Server=.; Integrated Security=True; Database=WeaponSalesMng");
SqlCommand cmd = new SqlCommand("select sum(Count) from CusRec where WeapName=@WeapName and Type=@Type", conn);
cmd.Parameters.Add(new SqlParameter("@WeapName", ReturnCount.Name));
cmd.Parameters.Add(new SqlParameter("@Type", type));//表里没有与type对应的记录,查询结果是Null;
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
if (!dr.Read())
{
conn.Close();//但是程序并没有跳到这里;
return 0;
}
else
{
int i = (int)dr[0];//而是进到了这里;并且出现了“制定的转换无效”
conn.Close();
return i;
}
}
public static int ReturnCount(Entity.WeaponInfo ReturnCount, string type)
{
SqlConnection conn = new SqlConnection("Server=.; Integrated Security=True; Database=WeaponSalesMng");
SqlCommand cmd = new SqlCommand("select sum(Count) from CusRec where WeapName=@WeapName and Type=@Type", conn);
cmd.Parameters.Add(new SqlParameter("@WeapName", ReturnCount.Name));
cmd.Parameters.Add(new SqlParameter("@Type", type));//表里没有与type对应的记录,查询结果是Null;
conn.Open();
int num = Convert.ToInt32(cmd.ExecuteScalar());
cmd.Dispose();
conn.Dispose();
return num;
}
------解决方案--------------------
如果sql查询没有返回记录,函数返回0。
如果sql查询返回了(一条或者多条)记录,取第一条记录的第一列的值(假设它是int类型的)并返回。
可惜你的sql查询返回的第一列不是一个int(例如可能是个DBNull)。
你可以去重新学学t-sql,看看统计函数sum(Count)会不会得到null值。
------解决方案--------------------
实际上,你代码中写的判断完全是多余的。因为此sql不可能是没有记录返回。因此就算使用你的ExecuteReader写的话那么应该类似地,写为
using(var conn = new SqlConnection("Server=.; Integrated Security=True; Database=WeaponSalesMng"))
{
SqlCommand cmd = new SqlCommand("select isnull(sum(Count),0) from CusRec where WeapName=@WeapName and Type=@Type", conn);
cmd.Parameters.Add(new SqlParameter("@WeapName", ReturnCount.Name));
cmd.Parameters.Add(new SqlParameter("@Type", type));
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
dr.Read(); //它永远都是true,因此你用不着多次一举去判断if
int i = (int)dr[0];
return i;
}