Database DBnull到整数转换错误

Database DBnull到整数转换错误,database,vb.net,Database,Vb.net,我得到从类型“DBNull”到类型“Integer”的转换无效。“Dim avgObject As string=Cstr(avgCom.ExecuteScalar())行上的错误” 如果删除了where module_ID='“&moduleSelect&'语句,并且我不知道如何修复此问题,有人能帮忙吗 Dim moduleSelect As String = moduleRadio.SelectedValue Using connection As New SqlConnec

我得到从类型“DBNull”到类型“Integer”的转换无效。“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

改用Convert.ToString。Directcast as字符串不适用于Null/Nothing

更新 当您没有收到任何结果时,问题就会发生

我进行了测试,所以CStr to 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

DBNull
表示数据库中的记录不包含列的值。所以基本上你是想把“无”转换成一个数字

你希望你的程序做什么?跳过这一排?是否改为使用默认值


如果从命令中删除语句时命令真的“有效”,我建议您只需删除它。

我相信您正在寻找类似的内容,首先检查它是否为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

错误:
从类型“DBNull”到类型“Integer”的转换无效。

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

试着像下面一样,它会帮助你

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

这可能会失败,因为缺少一个值。(即空值) 但如果遇到空行,则默认为0,则可能会起作用:

SELECT AVG(ISNULL(exam,0)) FROM completed_module where module_ID=
否则,请确保表中不包含该列的空值:

UPDATE completed_module SET exam = 0 WHERE exam IS NULL
(可能会对其进行约束,使其将来也不会有空值;))


编辑:这假设您实际上可以为每一行设置一个平均值,即使您访问的列为NULL,在这种情况下,我假设NULL不会向您的平均值添加任何内容(共享该ID的其他行可能会添加该值)因此,我将其默认为0

谷歌搜索从类型“DBNull”转换为类型“Integer”的
无效。
有近8000个结果。您可以运行查询
选择平均值(检查)。。其中模块ID=nnn
?我认为,它返回null是因为没有您传入的模块ID的记录。加载页面时没有从列表中选择值,因此返回null,感谢大家的帮助。