【问题标题】:How to troubleshoot "Object cannot be cast from DBNull to other types."如何解决“无法将对象从 DBNull 转换为其他类型”。
【发布时间】:2012-06-22 20:47:22
【问题描述】:

如何解决“无法将对象从 DBNull 转换为其他类型。”? 我正在使用组合框来检索服务的价格和折扣价,如果我在combobox3中选择一个项目一次,将不会发生错误,但如果我在combobox3中再次选择一个项目,“对象不能从DBNull投射到其他类型。”会发生..

这是我的代码

Private Sub ComboBox3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox3.SelectedIndexChanged

    Dim ds As New DataSet

    ds = getPrice(arr(ComboBox2.SelectedIndex), ComboBox3.Text)


    If ds.Tables("getPrice").Rows.Count > 0 Then
        For i As Integer = 0 To ds.Tables("getPrice").Rows.Count - 1

            TextBox1.Text = Convert.ToDecimal(ds.Tables("getPrice").Rows(i).Item(0))
            TextBox2.Text = Convert.ToDecimal(ds.Tables("getPrice").Rows(i).Item(1))

        Next
    End If

End Sub

这是我的查询

 Public Function getPrice(ByVal serviceId As String, ByVal breedSize As String)

    If breedSize = "Small Breed" Then
        sqlStr = "Select price_small_breed, discount_small_breed From tblServicePrice Where service_id = " + serviceId + ""
    ElseIf breedSize = "Medium Breed" Then
        sqlStr = "Select price_medium_breed, discount_medium_breed From tblServicePrice Where service_id = " + serviceId + ""
    ElseIf breedSize = "Big Breed" Then
        sqlStr = "Select price_big_breed, discount_big_breed From tblServicePrice Where service_id = " + serviceId + ""
    End If

    ds.Clear()
    da = New OleDbDataAdapter(sqlStr, con.ConnectionString)
    da.Fill(ds, "getPrice")


    Return ds

End Function

这是图片

出现此问题的原因可能是什么?

【问题讨论】:

  • 如果要分配给一组单一的文本框,迭代行的意义何在?

标签: vb.net visual-studio-2008 dataset


【解决方案1】:
TextBox1.Text = If(ds.Tables("getPrice").Rows(i).Item(0) Is DBNull.Value, "", Convert.ToDecimal(ds.Tables("getPrice").Rows(i).Item(0)).ToString()) 
TextBox2.Text = If(ds.Tables("getPrice").Rows(i).Item(0) Is DBNull.Value, "", Convert.ToDecimal(ds.Tables("getPrice").Rows(i).Item(1)).ToString()) 

【讨论】:

  • 是的,如果数据集中没有数据,则尝试将其转换为。 span>
【解决方案2】:

如果您针对数据库运行在 GetPrice 中执行的特定查询语句,您将看到至少有一行在您正在读取的序号位置具有空值。

很可能 serviceID(注意大写)不是您假设的值。

【讨论】:

    【解决方案3】:

    如果数据库中有 NULL 值会发生什么?如果可以接受使用某个值,例如零,你可以像这样修改查询

    sqlStr = "Select COALESCE(price_small_breed, 0), COALESCE(discount_small_breed, 0) From tblServicePrice Where service_id = " & serviceId & ""
    

    【讨论】:

      【解决方案4】:

      我的答案是这样。我声明了新数据集,我没有使用代码顶部的数据集

      Public Function getPrice(ByVal serviceId As String, ByVal breedSize As String) As DataSet
      
              Dim dsa As New DataSet
      
      
              If breedSize = "Small Breed" Then
                  sqlStr = "Select price_small_breed, discount_small_breed From tblServicePrice Where service_id = " + serviceId + ""
              ElseIf breedSize = "Medium Breed" Then
                  sqlStr = "Select price_medium_breed, discount_medium_breed From tblServicePrice Where service_id = " + serviceId + ""
              ElseIf breedSize = "Big Breed" Then
                  sqlStr = "Select price_big_breed, discount_big_breed From tblServicePrice Where service_id = " + serviceId + ""
              End If
      
              dsa.Clear()
              da = New OleDbDataAdapter(sqlStr, con.ConnectionString)
              da.Fill(dsa, "getPrice")
      
              Return dsa
      
          End Function
      

      这是我之前的代码..

      Public Function getPrice(ByVal serviceId As String, ByVal breedSize As String)
      
          If breedSize = "Small Breed" Then
              sqlStr = "Select price_small_breed, discount_small_breed From tblServicePrice Where service_id = " + serviceId + ""
          ElseIf breedSize = "Medium Breed" Then
              sqlStr = "Select price_medium_breed, discount_medium_breed From tblServicePrice Where service_id = " + serviceId + ""
          ElseIf breedSize = "Big Breed" Then
              sqlStr = "Select price_big_breed, discount_big_breed From tblServicePrice Where service_id = " + serviceId + ""
          End If
      
          ds.Clear()
          da = New OleDbDataAdapter(sqlStr, con.ConnectionString)
          da.Fill(ds, "getPrice")
      
      
          Return ds
      
      End Function
      

      【讨论】:

      • 它有效,这就是为什么我是回答我的问题的人@StingyJack,答案不起作用......
      • 你是谁对我说这种话的?不要对我说那种话,因为你甚至没有发布你对我问题的解决方案......
      • @StingyJack - 确定这是有道理的,它只是没有回答问题。 uer188228 找到了一种解决方法 - 只是不要选择 NULL 列。当然,如果有一个意外的 null,那么情况将是正确的。
      • @StingyJack-stackoverflow 的目的是什么? stackoverflow 的存在是为了帮助其他人追求他们的编程事业,帮助其他人解决编程中的问题......
      • 提出问题,解决问题并获得答案。您基本上问了一个问题,忽略了所有其他解释您收到此错误的原因以及如何修复它的答案,并选择了您自己的一个甚至无法解决您最初发布的问题的答案。现在,这些蹩脚的信息将永远被其他人阅读和混淆。
      猜你喜欢
      • 2022-12-04
      • 2013-08-23
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多