Ошибка значения строки DataTable DBNull

У меня возникла проблема при обращении к элементу в строке данных.

Когда я выполняю приведенный ниже код, мое намерение состоит в том, чтобы передать представление сетки данных в таблицу данных, выполнить сравнение с данными и выполнить определенный набор событий, однако, когда я запускаю

"Для каждой PaymentRow как DataRow в dtPayments.Rows"

строка я нахожу, что все элементы в строке "DBNull".

Код прерывается на следующей строке

"If PaymentRow.Item("Amount") = PaymentRow.Item("OutstandingBalance") Then"

Это ошибка из-за того, что он не может сравнить два объекта DBNull

Я застрял на этом, так как я просматривал свой код бесчисленное количество раз и до сих пор не могу понять его суть.

Заранее спасибо за помощь ребята

 Private Sub btnSave_Click(sender As System.Object, e As System.EventArgs) Handles btnSave.Click
    Dim dtPayments As New DataTable

    For Each dgColumn As DataGridViewColumn In dgvInvoices.Columns
        Dim dc As New DataColumn
        dc.ColumnName = dgColumn.Name
        dc.DataType = dgColumn.ValueType
        dtPayments.Columns.Add(dc)
    Next

    For Each dgRow As DataGridViewRow In dgvInvoices.Rows

        Dim drow As DataRow = dtPayments.NewRow
        For Each dCell As DataGridViewCell In dgRow.Cells
            If dCell.OwningColumn.Name = "Amount" Then
                If IsDBNull(dCell.Value) Then
                    drow.Item(dCell.OwningColumn.Name) = 0.0
                Else
                    drow.Item(dCell.OwningColumn.Name) = dCell.Value
                End If
            Else
                drow.Item(dCell.OwningColumn.Name) = dCell.Value
            End If
        Next

        dtPayments.Rows.Add(dgRow)


    Next


    For Each PaymentRow As DataRow In dtPayments.Rows

        Dim strInvoiceRef As String = PaymentRow.Item("InvoiceRef").ToString


        If PaymentRow.Item("Amount") = PaymentRow.Item("OutstandingBalance") Then
            CreateDebit(PaymentRow.Item("Amount"), strInvoiceRef)
            CropTrackMod.PaidInvoiceHeader(strInvoiceRef, True)
            Dim dtTicketsOnInvoice As DataTable = CropTrackMod.GetDistinctTicketsOnInvoice(strInvoiceRef)
            For Each DistinctRow As DataRow In dtTicketsOnInvoice.Rows
                'set this list to paid
                CropTrackMod.PaidTicket(DistinctRow.Item("TicketRef").ToString(), True)

            Next
        ElseIf PaymentRow.Item("AmountPaid") < PaymentRow.Item("OutstandingBalance") Then
            CreateDebit(PaymentRow.Item("Amount"), strInvoiceRef)
        End If


    Next

End Sub

person PowerMan2015    schedule 20.03.2014    source источник


Ответы (1)


В дополнение к проверке «Сумма» проверьте, является ли «OutstandingBalance» значением DBNull, когда вы перебираете строки. Таким образом, он также будет установлен на 0,0, поэтому ваше сравнение позже будет действительным:

For Each dgRow As DataGridViewRow In dgvInvoices.Rows
        Dim drow As DataRow = dtPayments.NewRow
        For Each dCell As DataGridViewCell In dgRow.Cells
            If dCell.OwningColumn.Name = "Amount" Or dCell.OwningColumn.Name = "OutstandingBalance" Then
                etc.
person spongessuck    schedule 20.03.2014
comment
как PaymentRow(Amount), так и PaymentRow(OutstandingBalance) отображаются как dbnull depite check Amount. OutstandingBalance берется из базы данных и всегда имеет значение. - person PowerMan2015; 20.03.2014
comment
PaymentRow(Amount) равен DBNull при сравнении? Вы устанавливаете источник данных dgvInvoices программно? Если да, вызывал ли dgvInvoices DataBind() к моменту срабатывания этого обработчика? - person spongessuck; 20.03.2014
comment
да, сумма и непогашенная сумма равны нулю при сравнении. Я передаю структуру и значения из DataGridView в новую таблицу данных, а затем перебираю каждую строку в таблице данных. DataBind() не выполнялся - person PowerMan2015; 21.03.2014