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