VB.NET从类型'DBNull'到类型'Decimal'的转换在字段有数据时无效

时间:2012-02-07 03:04:01

标签: .net database vb.net

我一直在寻找这个问题的解决方案一段时间了,感觉真的很困难;我可以找到与我相似但不一样的问题的解决方案。

我使用存储过程从本地MSSQL数据库中提取数据,然后将数据发送到Web服务。组件的每个部分都运行良好,除了一个讨厌的问题,DBNull字段返回DataRow,当我知道该字段不为空且具有有效数据时。添加到此字段的数据库和关联的INSERT语句旨在不允许NULL个条目。当我调试在抛出错误的行之前或之前打破程序时,我看到该字段具有当前行的有效数据。 如果我在代码中添加一个空检查(如下所示),操作将继续正常进行:

        Dim dataResultsTable = Me.myViewTableAdapter.GetData(int)

        For Each myDataRow In dataResultsTable.Rows
                        If worker.CancellationPending Then
                            e.Cancel = True
                        Else
                            If myDataRow.Item("syncd") = 0 Then
                               If IsDBNull(myDataRow.Item("bidamount")) Then
                                  _bidAmt = ""
                               Else
    // With out the null check this line throws an error
                                  _bidAmt = myDataRow.Item("bidamount") 
                               End If    

                               If IsDBNull(myDataRow.Item("date_time")) Then
                                  _dateTime = ""
                               Else
    // With out the null check this line throws an error
                                  _dateTime = myDataRow.Item("date_time")
                               End If

// . . . . . . . . 

                               worker.ReportProgress(percentcomplete)
                            End If
                         End If
                      Next

这里的问题是:为什么read操作返回DBNull而不是数据库中的数据?这里的任何和所有帮助都非常感谢!

编辑:为了清楚起见,操作确实返回了正确的数据,但数据没有保存到变量中。

2 个答案:

答案 0 :(得分:1)

这只是一个建议。为了不使用IsDBNull,您为什么不通过使用Stored Procedure

转换Null字段的默认值来更改COALESCE

例如:

SELECT COALESCE(bidamount,''), -- this will convert null value into empty one
       COALESCE(date_time,''), ..... 
FROM .....

与您的代码_bidAmt = ""_dateTime = ""

一样
                    If worker.CancellationPending Then
                        e.Cancel = True
                    Else
                        If myDataRow.Item("syncd") = 0 Then
                              _bidAmt = myDataRow.Item("bidamount")    
                              _dateTime = myDataRow.Item("date_time")
                        End If
                           worker.ReportProgress(percentcomplete)
                        End If
                     End If

答案 1 :(得分:0)

另一个建议是使用DataRow的Field方法和可空类型。

例如,如果数据库中的列是小数,则可以使用以下内容:

decimal? _bidAmt = myDataRow.Field<decimal?>("bidamount");

这样,数据库中的NULL值将被正确处理。

BTW:我希望你没有使用字符串在你的数据库中存储日期,因为你的代码似乎意味着!!