我正在开发一个从Excel电子表格导入的vb.net应用程序。
If rdr.HasRows Then
Do While rdr.Read()
If rdr.GetValue(0).Equals(System.DBNull.Value) Then
Return Nothing
Else
Return rdr.GetValue(0)
End If
Loop
Else
我使用字符串值来存储double值,在准备数据库语句时我会使用这段代码:
If (LastDayAverage = Nothing) Then
command.Parameters.AddWithValue("@WF_LAST_DAY_TAG", System.DBNull.Value)
Else
command.Parameters.AddWithValue("@WF_LAST_DAY_TAG", Convert.ToDecimal(LastDayAverage))
End If
我现在有一些带有相当多小数位的数据,数据以科学计数法输入到字符串变量中,所以这似乎是错误的方法。使用字符串变量开始似乎没有用。
如果我使用double或decimal类型变量,则空白excel值会出现0.0。
如何保留空白值?
注意:我试过了
变量为Nullabe(双倍)
但是当我将值传递给SQL插件时,我得到:“Nullable对象必须有一个值。”
解决方案:
通过更改我正在调用的子中的参数的数据类型,然后使用Variable.HasValue来执行条件DBNull插入来修复。
答案 0 :(得分:4)
我不知道您使用哪个API来执行数据库插入,但是对于其中许多API(包括ADO.NET),插入空值的正确方法是使用DBNull.Value。所以我的建议是你在VB代码中使用Nullable(Of Double)
,但是当需要进行插入时,你可以用DBNull.Value
替换任何空值。
答案 1 :(得分:3)
你需要问号吗?让Double(或任何值类型)可以存储null(或Nothing)。 E.g:
Dim num as Double? = Nothing
注意?标记
存储在db:
中If num Is Nothing Then
... System.DBNull.Value ...
Else
... num ...
End If
或更好:
If num.HasValue Then
... System.DBNull.Value ...
Else
... num.Value ...
End If
答案 2 :(得分:0)
我正在撰写文章HERE,同时我一直在寻找如何实现您的情况的解决方案,但文章可能有另一个解决方案,即删除空值,并添加默认值。如果我发现任何其他内容,我会发布它。
设置数据库时(至少 在MS SQL Server中,您可以标记一个字段 允许NULL值和哪些 要采取的默认值。如果你看 通过人们的数据库结构,你会 看到很多人都允许NULL 数据库中的值。这是一个 非常糟糕的主意。我建议永远不要 除非字段允许NULL值 逻辑上可以有一个NULL值(和 即便如此,我发现这只是真的 在DATE / TIME字段中发生。)
NULL值会导致一些问题。对于初学者,NULL值 与数据值不同。一个 NULL值基本上是未定义的 值。在ColdFusion端,这是 因为NULL值来临并不可怕 作为空字符串(最多 部分)。但在SQL中,NULL和空 字符串是非常不同的,行为非常 不同。请参考以下数据 表例如:
id name --------------- 1 Ben 2 Jim 3 Simon 4 <NULL> 5 <NULL> 6 Ye 7 8 9 Dave 10
这个表有一些空字符串(id:7,8,10)和一些NULL值 (id:4,5)。看看这些行为如何 不同的是,请看以下内容 查询我们试图找到的地方 没有的字段数 值:
Launch code in new window » Download code as text file » * SELECT * ( * SELECT * COUNT( * ) * FROM * test t * WHERE * LEN( t.name ) = 0 * ) AS len_count, * ( * SELECT * COUNT( * ) * FROM * test t * WHERE * t.name IS NULL * ) AS null_count, * ( * SELECT * COUNT( * ) * FROM * test t * WHERE * t.name NOT LIKE '_%' * ) AS like_count, * ( * SELECT * COUNT( * ) * FROM * test t * WHERE * t.name IS NULL * OR * t.name NOT LIKE '_%' * ) AS combo_count This returns the following record: LEN Count: 3 NULL Count: 2 LIKE Count: 3 Combo Count: 5
我们正在寻找5作为记录4,5,7,8和10没有值 在他们中。但是,你可以看到 只有一次尝试返回5.这是 因为NULL值不是 有长度,它不是数据类型 这有意义的长度。怎么能 什么都没有或没有长度? 这就像问“这个数学是什么 方程式闻起来像?“你做不到 比较那样。
因此,允许使用NULL值会让您更难以获得这种值 您正在寻找的数据。从一个 相关角度,允许NULL值 减少你对此的信念 数据库中的数据。你永远不可能 非常确定是否存在值或 不。这会让你感到安全吗? 编程时舒服吗?
此外,在NULL值上运行LEN()时不会像你一样 可能会想到它,它也没有 抛出一个错误。这将使 如果你更难调试你的代码 不明白的区别 在NULL值和数据值之间。
底线:除非绝对必要,否则不要允许空值。 你只会让事情变得更难 为了你自己。