1

我明白了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
4

5 回答 5

2

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

你想让你的程序做什么?跳过行?改用默认值?

如果您从命令中删除一条语句,该命令真的“有效”,我建议您简单地删除它。

于 2013-04-08T14:47:19.670 回答
2

我相信您正在寻找这样的东西,首先检查它是否为 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
于 2013-04-08T14:48:16.820 回答
0

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

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

我测试过,所以 CStr to Convert.ToString 适用于 DBNUll,但 CInt 和 Convert.ToIntXX 仍然会引发错误。您可以使用

Dim scalarResult = avgCom.ExecuteScalar()
If Convert.IsDBNull(scalarResult) then
  avgObject = 0
Else
  avgObject = Convert.toInt32(scalarResult)
End If
于 2013-04-08T14:47:11.673 回答
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))
于 2013-04-08T15:09:00.777 回答
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

于 2013-04-08T15:13:05.900 回答