我一直在寻找这个问题的解决方案一段时间了,感觉真的很困难;我可以找到与我相似但不一样的问题的解决方案。
我使用存储过程从本地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
而不是数据库中的数据?这里的任何和所有帮助都非常感谢!
编辑:为了清楚起见,操作确实返回了正确的数据,但数据没有保存到变量中。
答案 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:我希望你没有使用字符串在你的数据库中存储日期,因为你的代码似乎意味着!!