我得到了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
答案 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