DBnull到整数转换错误

时间:2013-04-08 14:44:21

标签: database vb.net

我得到了Conversion from type 'DBNull' to type 'Integer' is not valid." error on the line "Dim avgObject As string = Cstr(avgCom.ExecuteScalar())

当删除where module_ID='" & moduleSelect & "'语句并且我不知道如何解决此问题时,该命令是否有效,是否有人可以提供帮助?

    Dim moduleSelect As String = moduleRadio.SelectedValue
    Using connection As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
        Using avgCom As New SqlCommand("SELECT AVG(exam) FROM completed_module where module_ID='" & moduleSelect & "' ", _
                                        connection)
            connection.Open()
            Dim avgObject As Integer = CInt(avgCom.ExecuteScalar())
            Dim averageVar As String
            averageVar = avgObject.ToString
            avgLabel.Text = averageVar
        End Using

5 个答案:

答案 0 :(得分:2)

DBNull表示数据库中的记录不包含该列的值。所以基本上你试图将“无”转换为数字。

您希望自己的计划做什么?跳过这一排?使用默认值代替?

如果命令确实“工作”,如果从命令中删除一个语句,我建议你删除它。

答案 1 :(得分:1)

我相信你正在寻找这样的东西,首先检查它是否是dbnull:

Dim moduleSelect As String = moduleRadio.SelectedValue

Using connection As New SqlConnection("Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True")
    Using avgCom As New SqlCommand("SELECT AVG(exam) FROM completed_module where module_ID='" & moduleSelect & "' ", _
                                    connection)
        connection.Open()
        Dim result = avgCom.ExecuteScalar()
        If IsDBNull(result) then return
        Dim avgObject As Integer = CInt(result)
        Dim averageVar As String
        averageVar = avgObject.ToString
        avgLabel.Text = averageVar
    End Using

答案 2 :(得分:0)

请改用Convert.ToString。 Directcast as string不适用于Null / Nothing

<强>更新 只要您没有收到任何结果,就会出现问题。

我测试过,所以CStr到Convert.ToString适用于DBNUll,但CInt和Convert.ToIntXX仍然会引发一个eception。 你可以使用

Dim scalarResult = avgCom.ExecuteScalar()
If Convert.IsDBNull(scalarResult) then
  avgObject = 0
Else
  avgObject = Convert.toInt32(scalarResult)
End If

答案 3 :(得分:0)

错误: Conversion from type 'DBNull' to type 'Integer' is not valid.

发生此错误是因为您的查询返回NULL值...您可以使用以下代码管理NULL值。

尝试以下它会帮助你...

connection.Open()
Dim result As String = avgCom.ExecuteScalar().ToString()
Dim avgObject As Integer = If(result = "", 0, CInt(result))

答案 4 :(得分:0)

可能会因为缺少值而失败。 (即NULL) 但是如果遇到NULL的行,则默认为0可能会有效:

SELECT AVG(ISNULL(exam,0)) FROM completed_module where module_ID=

否则,请确保您的表不包含该列的NULL值:

UPDATE completed_module SET exam = 0 WHERE exam IS NULL

(也许约束它所以它也可能没有未来的NULL值;))

编辑:这假设你实际上可以拥有每一行的平均值,即使你访问的列是NULL的那些,在这种情况下我会假设NULL不会向你的平均值添加任何东西(其他行是分享该ID可能)所以我默认为0