【问题标题】:Unable to convert object to double无法将对象转换为双精度
【发布时间】:2015-06-12 05:47:16
【问题描述】:

当向数据库中插入一个新学生时,他们的 GPA 没有被输入,所以当我调用一个事件处理程序来显示 GPA 时,它会崩溃。

object value;    
sql = string.Format("SELECT ROUND(AVG(CAST(Rating AS Float)), 4) FROM GPA WHERE StudentID={0};;", StudentID);
value = this.datatier.ExecuteScalarQuery(sql);

double avgGPA;
if (value != null)
{
    System.Windows.Forms.MessageBox.Show("null");
    avgGPA = Convert.ToDouble(value);
}
else avgGPA = 0.0;

我尝试了这个修复,我在Convert.ToDouble() 之前确保value!=null,但无论如何我都会崩溃,尤其是在这一行:

avgGPA = Convert.ToDouble(value);

错误:对象不能从 DBNull 转换为其他类型。

我的问题是如何分配一个默认值,例如 0.0,以便在找不到 GPA 时程序不会崩溃?

编辑:每个人都在解决方案上,谢谢大家!新的问题变成了,DBNull 是否总是数据库查询的空值?

【问题讨论】:

  • 更改为 if(value != DbNull.Value)
  • 另外,当你找不到它时,我不会将 gpa 设置为 0。使其可以为空或其他东西
  • 没有人使用value is DBNull #sadpanda

标签: c#


【解决方案1】:

看看是不是DBNull

avgGPA = value == DBNull.Value ? 0D : Convert.ToDouble(value);

【讨论】:

    【解决方案2】:

    在查询中使用isnull()检查null是否返回默认值:

    SELECT ROUND(AVG(CAST(isnull(Rating,0) AS Float)), 4)
    

    【讨论】:

    • 如果没有行,这不会仍然为空吗?
    • 在当前的案例记录中肯定可以使用
    【解决方案3】:

    你可以在任何一边做,根据你的情况选择最有意义的:

    -- In the query, return zero if null
    select isnull(ROUND(AVG(CAST(Rating AS Float)), 4), 0.0) from...
    

    或者

    // In the code, check for DBNull
    if (value != DBNull.Value)
    {
        avgGPA = Convert.ToDouble(value);
    }
    

    【讨论】:

    • 当前查询总是返回记录
    • 是的,这个将返回 0,因为 isnull 被包裹在一组数据中。如果您刚刚执行了isnull(Rating, 0) 并且您的查询没有返回任何记录,那么value 实际上将是null,而不是DBNull,因为查询根本不会返回任何记录。如果你在评级上做了isnull 而不是平均,并且没有记录,那么你会得到DBNull。但是isnull 上的avg 意味着如果avg 由于某种原因最终为null,您仍然可以在查询中将其转换为零。
    【解决方案4】:

    你可以试试:

    double avgGPA = Convert.IsDBNull(value) ? 0.0 : Convert.ToDouble(value);
    

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 2011-03-11
      • 1970-01-01
      • 2015-02-12
      • 2015-04-24
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多