日期:2014-05-18 浏览次数:21273 次
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; }