【问题标题】:How to handle Conversion from type 'DBNull' to type 'Integer' is not valid如何处理从“DBNull”类型到“Integer”类型的转换无效
【发布时间】:2013-12-16 09:53:41
【问题描述】:

我只是想知道是否有人可以帮助我解决以下问题。我正在使用 VB。 NET 和 SQL Server,并希望在我的代码中包含一些错误处理。

我正在执行一个 SQL SUM 命令,如果数据库中有匹配项,该命令可以正常返回。但是,当我指定的字符串不匹配时,我会收到“从类型 'DBNull' 到类型 'Integer' 的转换无效。”

我了解发生此错误是因为我指定的数据库中没有任何值。

以下是我正在使用的代码,其中不包含错误处理:

Dim dbCount1 As Integer
    SQLConnectLog()
    strSQLog = "SELECT SUM ([TotalTime]) FROM [Line1Log] WHERE ([State] = 'Test')"
    dbCommandLog = New SqlCommand(strSQLog, dbConnectionLog)
    dbCount1 = dbCommandLog.ExecuteScalar()
    SQLDisconnectLog()
    lblTest.Text = dbCount1

现在我尝试了几种不同的方式来使用isDBNull,但都无济于事,例如:

Dim dbCount1 As Integer
    SQLConnectLog()
    strSQLog = "SELECT SUM ([TotalTime]) FROM [Line1Log] WHERE ([State] = 'Test')"
    dbCommandLog = New SqlCommand(strSQLog, dbConnectionLog)
    If IsDBNull(dbCount1 = dbCommandLog.ExecuteScalar()) Then
        SQLDisconnectLog()
        lblTest.Text = dbCount1
    Else
        lblTest.Text = "0"
    End If

我上面用的方法还是不行。

我确定我需要使用 isDBNull 函数,但不知道该放在哪里。

如果有人能给我一些关于如何做到这一点的见解,我将不胜感激。

提前致谢:)

【问题讨论】:

    标签: sql vb.net


    【解决方案1】:

    对于这个简单的查询,纯 SQL 解决方案可以依赖于 coalesce 或 isnull,只返回一个聚合列。

    SELECT COALESCE(SUM ([TotalTime]), 0) FROM [Line1Log] WHERE ([State] = 'Test')
    

    【讨论】:

    • 您好,感谢您的回复,这是我选择的答案,因为它完美运行,正是我想要的。再次感谢。
    【解决方案2】:

    尝试将 dbCount1 更改为可空整数

    Dim dbCount1 As Nullable(Of Integer)
    

    或者

    Dim dbCount1 As Integer?
    

    【讨论】:

    • 感谢您的回复,对我帮助很大
    【解决方案3】:

    将 dbCount1 定义为 Nullable 整数并调用 dbCount.HasValue 以检查该值是 Null 还是有效整数:

    ....
    Dim dbCount1 as Integer? = dbCommandLog.ExecuteScalar()
    if (dbCount1.HasValue) Then
        lblTest.Text = dbCount1
    ...
    

    更好的选择是使用If 运算符,如果第一个参数为空,则返回默认值:

    Dim dbCount1 as Integer? = dbCommandLog.ExecuteScalar()
    lblTest.Text=If(dbCount1,0)
    

    【讨论】:

    • 非常感谢您的回复。我已经尝试了您给我的两个示例,并且该方法很有意义,谢谢。但是,当使用上面的示例时,我得到“指定的演员表无效”。错误。
    • 使用整数,Nothing 会将值设置为 = 0。例如:Dim dbCount1 = If(Not IsDBNull(row.Item(3)), CInt(row.Item(3)), Nothing )
    • @JoshYates1980 不,从 Null (这就是 Nothing 是什么)到 int 的隐式转换将 - 将 actual 0 与空值混合。这种隐式转换是不可取的,因为它们会导致无法检测到的错误
    • 我的评论与问题有关,但未经测试。我经过测试的代码:Public Class Person with Public Property Age As Integer?这被设置为 0:Person.Age = If(Not IsDBNull(row.Item(3)), CInt(row.Item(3)), Nothing)
    • @JoshYates1980 那更糟。 Integer? 表示该属性应该接受 Null。您的代码将它们替换为 0。这是一个错误
    【解决方案4】:

    试试下面的 if 条件而不是你的,

    If(dbCommandLog.ExecuteScalar() = DBNull.Value, False, True)

    【讨论】:

      【解决方案5】:
      dbCount1 =CInt(dbCommandLog.ExecuteScalar())
      

      试试这个代码

      【讨论】:

      • 您好,谢谢您的回复,但是上面的代码给了我同样的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 2012-11-19
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多