保留双变量中的NULL值

时间:2010-04-15 17:26:42

标签: vb.net

我正在开发一个从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插入来修复。

3 个答案:

答案 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值和数据值之间。

     

底线:除非绝对必要,否则不要允许空值。   你只会让事情变得更难   为了你自己。