【问题标题】:DataTable DBNull Row Value ErrorDataTable DBNull 行值错误
【发布时间】:2014-04-27 20:26:53
【问题描述】:

在引用数据行中的项目时遇到问题。

当我执行下面的代码时,我的意图是将数据网格视图传输到数据表,与数据进行比较并执行一组特定的事件,但是当我运行

"对于每个 PaymentRow 作为 dtPayments.Rows 中的 DataRow"

我发现该行中的所有项目都是“DBNull”。

代码在下一行中断

“如果 PaymentRow.Item("Amount") = PaymentRow.Item("OutstandingBalance") 那么”​​

由于人脸无法比较两个 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

【问题讨论】:

    标签: datagridview datagrid vb.net-2010 datarow datacolumn


    【解决方案1】:

    除了检查“Amount”之外,在遍历行时检查“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.
    

    【讨论】:

    • PaymentRow("Amount") 和 PaymentRow("OutstandingBalance") 都显示为 dbnull,尽管检查“Amount”。 “OutstandingBalance”取自数据库,始终有一个值。
    • PaymentRow("Amount") 在您进行比较时是 DBNull 吗?您是否以编程方式设置 dgvInvoices 的数据源?如果是这样,在此处理程序触发时,dgvInvoices 是否调用了 DataBind()?
    • 是的金额和未完成的比较时为 db null。我将结构和值从 DataGridView 传递到新数据表,然后循环遍历数据表中的每一行。没有发生 DataBind()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2018-12-16
    • 2021-08-19
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多