2013-04-08 93 views
1

我得到的Conversion from type 'DBNull' to type 'Integer' is not valid." error on the line "Dim avgObject As string = Cstr(avgCom.ExecuteScalar())的DBNull到整数转换错误

命令的工作时,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

谷歌搜索'从类型'DBNull'转换为键入'整数'无效.'有近8000个结果。 – 2013-04-08 14:47:51

+0

你可以运行查询'SELECT AVG(exam)..其中Module_ID = nnn'?我认为,它返回null,因为没有你传入的module_ID的记录。 – shahkalpesh 2013-04-08 14:49:14

+0

当页面加载时没有从列表中选择任何值,从而给出null,谢谢大家的帮助。 – d99 2013-04-08 15:28:47

回答

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 
+0

这是完美的!它现在按预期工作,非常感谢! – d99 2013-04-08 15:21:08

0

改为使用Convert.ToString。 Directcast as string does not work for Null/Nothing

UPDATE 只要您没有收到任何结果,就会发生问题。

我测试过了,所以CStr到Convert.ToString都适用于DBNUll,但是CInt和Convert.ToIntXX仍然会引发一个问题。 您可以使用

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

DBNull意味着,在数据库中的记录不包含该列的值。所以基本上你试图把“无”转换成数字。

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

如果命令确实“有效”,如果您从命令中删除语句,我建议您只是将其删除。

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)) 
0

可能是因为缺少一个值而失败。 (即NULL) 但如果你默认为0,如果遇到与NULL的行它可能工作:

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