执行SQL求和命令时,列值为空引发C#程序报错问题咨询
解决Sum查询结果为空时的double转换报错问题
你的问题根源在于:当MainOper或Oper表中没有匹配指定Emp_no的记录时,SQL的Sum(amount_Gift)会返回NULL。直接将这个NULL转为字符串后用double.Parse解析,会触发FormatException,导致后续逻辑无法执行。
下面给出两种可靠的解决方案,同时修复代码里的SQL注入风险:
方案1:修改SQL查询,自动将NULL转为0
在SQL语句中用ISNULL函数(SQL Server适用),把Sum的结果默认转为0,这样查询永远返回数值类型,避免C#端处理NULL:
double tot_main, tot_oper, gift, sum_tot, sum_tot_gift, amount_gift_new, amount_cut; // 求和MainOper表(使用参数化查询+ISNULL处理NULL) SqlCommand check_main = new SqlCommand("select ISNULL(Sum(amount_Gift), 0) from MainOper where Emp_no=@Emp_no", con); check_main.Parameters.AddWithValue("@Emp_no", TextBox1.Text); SqlDataAdapter sd1 = new SqlDataAdapter(check_main); DataTable dt1 = new DataTable(); sd1.Fill(dt1); // 求和Oper表(同样处理) SqlCommand check_Oper = new SqlCommand("select ISNULL(Sum(amount_Gift), 0) from Oper where Emp_no=@Emp_no", con); check_Oper.Parameters.AddWithValue("@Emp_no", TextBox1.Text); SqlDataAdapter sd2 = new SqlDataAdapter(check_Oper); DataTable dt2 = new DataTable(); sd2.Fill(dt2); // 变量赋值:直接转换即可,无需担心NULL gift = double.TryParse(TextBox8.Text, out double g) ? g : 0; // 额外处理TextBox输入非法的情况 tot_main = Convert.ToDouble(dt1.Rows[0][0]); tot_oper = Convert.ToDouble(dt2.Rows[0][0]); // 后续计算逻辑不变 sum_tot = tot_oper + tot_main; sum_tot_gift = sum_tot + gift; amount_gift_new = sum_tot_gift - 1000; amount_cut = gift - amount_gift_new;
方案2:在C#代码中判断并处理DBNull
如果不想修改SQL,可以在读取DataTable数据时,判断是否为DBNull.Value,手动赋值0:
// 变量赋值部分修改为: gift = double.TryParse(TextBox8.Text, out double g) ? g : 0; tot_main = dt1.Rows[0][0] == DBNull.Value ? 0 : Convert.ToDouble(dt1.Rows[0][0]); tot_oper = dt2.Rows[0][0] == DBNull.Value ? 0 : Convert.ToDouble(dt2.Rows[0][0]);
重要提醒:修复SQL注入风险
你原来的代码用字符串拼接生成SQL语句,存在严重的SQL注入漏洞,必须改用参数化查询(上面的方案1已经实现),否则恶意用户可以通过输入特殊字符篡改SQL逻辑,导致数据泄露或破坏。
后续执行存储过程的代码也建议改成参数化:
SqlCommand co = new SqlCommand("gifter", con); co.CommandType = CommandType.StoredProcedure; co.Parameters.AddWithValue("@Emp_no", Emp_no2); co.Parameters.AddWithValue("@Emp_name", Emp_name2); co.Parameters.AddWithValue("@Emp_dept", Emp_dept2); co.Parameters.AddWithValue("@Emp_poss", Emp_poss2); co.Parameters.AddWithValue("@Ref_Gift", Ref_Gift2); co.Parameters.AddWithValue("@Run_Gift", Run_Gift2); co.Parameters.AddWithValue("@Date_Gift", Date_Gift2); co.Parameters.AddWithValue("@amount_cut", amount_cut); co.Parameters.AddWithValue("@Type_Gift", Type_Gift2); co.Parameters.AddWithValue("@Month_num", Month_num2); co.ExecuteNonQuery();
内容的提问来源于stack exchange,提问作者HUSSEIN ALI
相关产品推荐
相关产品推荐

