代码之家  ›  专栏  ›  技术社区  ›  Sam

在双变量中保留空值

  •  2
  • Sam  · 技术社区  · 14 年前

    我正在开发一个从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
    

    我使用字符串值来存储双精度值,在准备数据库语句时,我将使用以下代码:

    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
    

    我现在有一些小数点后的数据,这些数据是用科学记数法放入字符串变量的,所以这似乎是错误的方法。用字符串变量开头似乎不对。

    如果使用双或十进制类型变量,则空白Excel值会达到0。

    如何保存空白值?


    注:我试过了

    变量为nullabe(属于double)

    但是当将该值传递给sql insert时,我得到:“可为空的对象必须有一个值。”


    解决方案:

    通过更改调用的子对象中参数的数据类型,然后使用variable.hasvalue执行条件dbnull插入来修复此问题。

    3 回复  |  直到 7 年前
        1
  •  4
  •   Jacob    14 年前

    我不知道您使用哪个api来插入数据库,但是对于许多api,包括ado.net,插入空值的正确方法是使用 DBNull.Value . 所以我建议你用 Nullable(Of Double) 在您的vb代码中,但是当需要插入时,您可以用 DBNull.Value .

        2
  •  3
  •   CallMeLaNN    14 年前

    你需要问号吗?让double(或任何值类型)可以存储空值(或空值)。例如。:

    Dim num as Double? = Nothing
    

    注意?作记号。

    要存储在数据库中:

    If num Is Nothing Then
      ... System.DBNull.Value ...
    Else
      ... num ...
    End If
    

    或更好:

    If num.HasValue Then
      ... System.DBNull.Value ...
    Else
      ... num.Value ...
    End If
    
        3
  •  0
  •   Justin Gregoire    14 年前

    我要发表一篇文章 HERE 虽然我一直在寻找如何解决您的情况,但本文可能有另一个解决方案,即删除空值,并添加默认值。如果我找到别的东西,我会把它寄出去。

    设置数据库时(至少 在MS SQL Server中)可以标记字段 允许空值 要采用的默认值。如果你看 通过人们的数据库结构,你将 看到很多人允许 数据库中的值。这是一个 很糟糕的主意。我建议永远不要 允许空值,除非字段 逻辑上可以有一个空值(和 即使是这个我发现这个只是真的 在日期/时间字段中发生)。

    空值会导致一些问题。对于初学者,空值 与数据值不同。一 空值基本上是未定义的 价值观。在寒冷的一端,这是 值为空并不可怕 作为空字符串(最多 部分)。但是在sql中,空的 弦是非常不同的,表现非常 不一样。获取以下数据 表例如:

    id    name
    ---------------
    1     Ben
    2     Jim
    3     Simon
    4     <NULL>
    5     <NULL>
    6     Ye
    7
    8
    9     Dave
    10
    

    这个表有一些空字符串(id:7、8、10)和一些空值 (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。这是 因为当一个空值不 有一个长度,它不是数据类型 这在长度上是有道理的。怎样才能 什么都没有长度? 就像在问“这算什么” 方程式闻起来像?”你做不到 这样的比较。

    因此,允许空值会使您更加努力地获得 你要找的数据。从A 相关角度,允许空值 减少你对 数据库中的数据。你永远不能 非常确定某个值是否存在或 不是。你觉得安全吗 编程时感觉舒服吗?

    此外,当对空值运行len()时,不会像 可能会想,也不会 抛出错误。这将使 调试代码更加困难 不明白区别 介于空值和数据值之间。

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