-2

「オブジェクトを DBNull から他の型にキャストできません。」のトラブルシューティング方法を教えてください。コンボボックスを使用してサービスの価格と割引価格を取得しています. コンボボックス3のアイテムを一度選択するとエラーは発生しませんが、コンボボックス3でアイテムを再度選択すると、「オブジェクトを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

ここに画像があります

ここに画像の説明を入力

この問題の原因は何ですか?

4

4 に答える 4

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()) 
于 2012-06-20T17:01:51.060 に答える
1

GetPrice で実行された特定のクエリ ステートメントをデータベースに対して実行すると、読み取っている序数の位置で少なくとも 1 つの行に null 値があることがわかります。

serviceID (大文字に注意してください) は、想定している値ではない可能性があります。

于 2012-06-20T17:32:32.800 に答える
0

データベースにNULL値がある場合、どうなりますか?代わりにゼロなどの値を使用してもよい場合は、次のようにクエリを変更できます。

sqlStr = "Select COALESCE(price_small_breed, 0), COALESCE(discount_small_breed, 0) From tblServicePrice Where service_id = " & serviceId & ""
于 2012-06-20T17:23:42.707 に答える
-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
于 2012-06-20T17:33:12.793 に答える