C# 无法将对象转换为双精度
在将新学员插入数据库时,他们的GPA不会被输入,因此当我调用事件处理程序来显示GPA时,它会崩溃C# 无法将对象转换为双精度,c#,C#,在将新学员插入数据库时,他们的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
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;
我尝试了这个修复,确保值=在IConvert.ToDouble()
之前为null,但无论如何我都会崩溃,尤其是在这一行:
avgGPA = Convert.ToDouble(value);
错误:无法将对象从DBNull强制转换为其他类型
我的问题是如何分配一个默认值,如0.0,以便在找不到GPA时程序不会崩溃
编辑:感谢所有人,每个人都在解决方案上取得了成功!新的问题是,DBNull是否总是数据库查询的null?只需检查它是否为空
在查询中,使用isnull()
检查是否为null返回默认值:
考虑到您的情况,您可以在任何一方执行此操作,以最有意义的为准:
-- In the query, return zero if null
select isnull(ROUND(AVG(CAST(Rating AS Float)), 4), 0.0) from...
或
您可以尝试:
double avgGPA = Convert.IsDBNull(value) ? 0.0 : Convert.ToDouble(value);
更改为if(value!=DbNull.value)同样,如果找不到gpa,我不会将其设置为0。使其可为null或其他任何人不使用的值为DBNull
\sadpandacurrent查询将始终返回recordYes,此查询将返回0,因为为null
是围绕数据的聚合。如果您刚刚执行了isnull(评级,0)
,并且您的查询没有返回任何记录,那么value
实际上将是null
,而不是DBNull
,因为查询根本不会返回任何记录。如果您在评级上而不是在平均值上执行了isnull
,并且没有记录,那么您将得到DBNull
。但是avg
上的isnull
意味着,如果avg
由于任何原因最终为null,您仍然可以在查询中将其转换为零。如果没有行,这不是仍然为null吗?在当前情况下,记录肯定可用
-- 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);
}
double avgGPA = Convert.IsDBNull(value) ? 0.0 : Convert.ToDouble(value);