【问题标题】:Preserving NULL values in a Double Variable在双变量中保留 NULL 值
【发布时间】:2011-02-08 12:09: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.0。

如何保留空白值?


注意:我试过了

变量为 Nullabe(Of Double)

但是当将值传递给 SQL 插入时,我得到:“可空对象必须有一个值。”


解决方案:

通过更改我调用的 sub 中参数的数据类型,然后使用 Variable.HasValue 进行条件 DBNull 插入来修复。

【问题讨论】:

  • 是否有任何不应为空的 0.0 值?
  • 数据库中的那个字段是否允许空值?
  • 是的,有 0.0 也有空值。这就是问题:)

标签: vb.net


【解决方案1】:

我不知道您使用哪个 API 来进行数据库插入,但对于其中的许多 API,包括 ADO.NET,插入空值的正确方法是使用 DBNull.Value。所以我的建议是你在你的VB代码中使用Nullable(Of Double),但是当需要插入时,你可以用DBNull.Value替换任何​​空值。

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

    • 这样 0.0 是一个值,num = Nothing 是一个不是 0.0 的空值。
    • 请注意,您不能只指定 null(或 Nothing)存储在 DB 中。这就是 .Net 有 System.DBNull.Value 的原因。您需要执行 If Else 来存储 System.DBNull.Value 或正确的值。
    • 使用您的语法给出“字符无效”。我正在使用 VS 2005。也许这是一种较新的 .net 框架语法?
    • c# 和 VB.NET 都使用相同的“?”我只注意到那个双?与 Nullable(Of Double) 或 Nullable 相同
    • 那个? VB 中 Nullable 类型的符号仅对 VB9 及更高版本有效。 VB8中不存在(随VS2005发布)
    【解决方案3】:

    我正在发布一篇文章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 值 (编号: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 值和数据值之间。

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

    【讨论】:

    • 这让我对这种情况有了更多的思考,我正在咨询流程所有者。也许我们可以将这一行留在数据库之外,除非他们需要知道当天没有进行测量。
    • 他们确实需要存储空值,或者至少需要存储该值不可用的事实。
    • @Sam 没问题。我已经和我的同事讨论过了,在某些情况下空值可能很有用,例如:如果学生不参加考试,他们将有一个空值而不是 0.0 作为考试的分数,如果他们有a 0.0 将被视为失败而不是未完成考试,从而导致他们的平均成绩不一致。
    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2021-11-17
    • 1970-01-01
    • 2022-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    相关资源
    最近更新 更多