【问题标题】:Conversion from type 'DBNull' to type 'Double' is not valid从“DBNull”类型到“Double”类型的转换无效
【发布时间】:2016-03-18 19:16:59
【问题描述】:

在我的代码中,我理解查询获取空值并引发此错误。但由于我的查询有点复杂,我不明白如何检查空值并避免此错误。请帮我更正这个查询。

SELECT (SUM(charges) + SUM(behaviour) + SUM(admission) + SUM(properInformation) + SUM(hygine) + SUM(treatment))/(count(doctorID) * 6) AverageRating, COUNT(ID) RatingCount from ratings where doctorID = '" + doctorID + "'

【问题讨论】:

  • 您的错误听起来不像是查询本身。听起来您并没有将代码中的某些内容声明为新内容。
  • 该错误是 .NET 错误,而不是 SQL 错误。当然,这可能是您选择的结果造成的,但您需要向我们提供有关代码的更多详细信息,以获得这部分的帮助。
  • 具体是哪一行出现此错误?
  • 不能确定到底发生了什么,但是你总是会得到一个总和的一行,但是如果医生不存在,你会得到 dbnull/null 作为平均评级,这可能惹麻烦。
  • 你可以在这里找到一个很好的答案stackoverflow.com/questions/4660142/…

标签: mysql sql asp.net vb.net


【解决方案1】:

如果您希望查询不返回NULL,您可以用IFNULL 将表达式括起来以将可能的NULL 转换为0,例如;

SELECT IFNULL((SUM(charges) + SUM(behaviour) + SUM(admission) + 
               SUM(properInformation) + SUM(hygine) + SUM(treatment))
              /(count(doctorID) * 6), 0) AverageRating, 
       COUNT(ID) RatingCount 
FROM ratings 
WHERE doctorID = '" + doctorID + "'

【讨论】:

  • 这只会将空值总和转换为 0,还是将任何求和列中的任何空值转换为 0?
  • @AaronD 只是空总和,如果您希望各个总和变为 0,则需要在每个总和周围加上一个 ifnull。遗憾的是,在添加带有任何其他值的 null 时,SQL 不是很灵活。
  • 好的,谢谢,这正是我所期望的。不过那会很好,呵呵。
【解决方案2】:

如果您确定您的查询正确返回 null 值,那么您可以使用 try-catch 块,如下所示:

Try
Dim dt As DataTable = Me.GetData("SELECT (SUM(charges) + SUM(behaviour) + SUM(admission) + SUM(properInformation)
Catch ex As Exception
MsgBox("Error while fetching data" & vbCrLf & ex.Message)
End Try

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 2012-11-19
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多