Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET从类型转换为';DBNull';输入';十进制';字段包含数据时无效_.net_Database_Vb.net - Fatal编程技术网

VB.NET从类型转换为';DBNull';输入';十进制';字段包含数据时无效

VB.NET从类型转换为';DBNull';输入';十进制';字段包含数据时无效,.net,database,vb.net,.net,Database,Vb.net,我一直在寻找一个解决这个问题的办法,现在我觉得真的卡住了;我可以找到解决问题的方法,这些方法与我的方法相似,但不尽相同 我使用存储过程从本地MSSQL数据库中提取数据,然后将数据发送到web服务。组件的每个部分都工作得很好,除了一个令人讨厌的问题,当我知道字段不是空的并且有有效数据时,DataRow字段将返回一个DBNull。添加到此字段的数据库和相关的INSERT语句被设计为不允许NULL条目。当我在抛出错误的行上或之前调试中断程序时,我看到该字段具有当前行的有效数据。 如果我在代码中添加空检

我一直在寻找一个解决这个问题的办法,现在我觉得真的卡住了;我可以找到解决问题的方法,这些方法与我的方法相似,但不尽相同

我使用存储过程从本地MSSQL数据库中提取数据,然后将数据发送到web服务。组件的每个部分都工作得很好,除了一个令人讨厌的问题,当我知道字段不是空的并且有有效数据时,
DataRow
字段将返回一个
DBNull
。添加到此字段的数据库和相关的
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
这里的问题是:为什么读取操作返回的是
DBNull
,而不是数据库中的数据?非常感谢您的帮助


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

这只是一个建议。为了不使用
IsDBNull
,为什么不使用
COALESCE
转换
Null
字段的默认值来更改
存储过程

例如:

SELECT COALESCE(bidamount,''), -- this will convert null value into empty one
       COALESCE(date_time,''), ..... 
FROM .....
与您的代码一样
\u bidAmt=“”
\u dateTime=“”


另一个建议是使用DataRow的Field方法以及可为空的类型

例如,如果数据库中的列为十进制,则可以使用如下内容:

decimal? _bidAmt = myDataRow.Field<decimal?>("bidamount");
decimal_bidAmt=myDataRow.Field(“bidamount”);
这样,数据库中的空值将得到正确处理


顺便说一句:我希望你不是像你的代码所暗示的那样,用字符串在数据库中存储日期

演示如何知道数据返回非空值。与问题无关,但您应该在
e.Cancel=True
之后添加一个
退出,谢谢@JoelCoehoorn,我错过了这一步,我通常在这方面做得很好。@JoelCoehoorn,当我在
If worker.CancellationPending Then
语句中中断程序的执行时,然后展开
dataResultsTable
变量的值,我看到抛出错误的字段中有值。这件事让我很为难,据我所知,它应该是可行的。(以前只遇到过一次这种情况)这是一种很好的方法,但问题是为什么结果集包含数据而不是DBNull,而是
.item
方法返回DBNull。数据在那里,但由于某种原因返回为null。但我会把你的建议放在我的口袋里,以后,我会半经常遇到这种情况。谢谢@johnal虽然你没有完全回答原来的问题,但我将你的答案标记为已接受,因为你有我之前遇到的另一个相关问题的答案!非常感谢。
decimal? _bidAmt = myDataRow.Field<decimal?>("bidamount");