保留双变量中的NULL值

问题描述:

我正在研究从Excel电子表格导入的vb.net应用程序。保留双变量中的NULL值

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。

如何保留空白值?


注:我已经试过

Variable作为Nullabe(双)

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


解决方案:

通过改变我打电话子参数的数据类型,然后使用Variable.HasValue做有条件的DBNull插入固定。

+0

是否存在为0.0的任何值不应该是空? – Barry 2010-04-15 17:34:26

+0

数据库中的该字段是否允许空值? – R0MANARMY 2010-04-15 17:36:02

+0

是的,有0.0和有空值。这就是问题:) – Sam 2010-04-15 17:44:10

我不知道你使用哪个API来做数据库插入,但是包括ADO.NET在内的许多API,插入NULL值的正确方法是使用DBNull.Value。所以我的建议是,你在你的VB代码中使用了Nullable(Of Double),但是当它开始插入时,你会用DBNull.Value替换任何空值。

我发布文章HERE,而我一直在寻找如何达到您的情况的解决方案,但文章可能有另一个解决方案是删除空值,并添加一个默认值。如果我找到其他东西,我会发布它。

当您设置(MS SQL Server中至少 )的数据库,你可以标志一个字段作为 允许空值和 默认值取。如果你通过人们的数据库结构看 ,你会发现 看到很多人在他们的数据库中允许NULL 值。这是一个非常糟糕的主意。我会建议从来没有 允许NULL值,除非字段 可以在逻辑上有一个NULL值(和 即使这我觉得这只有真的 发生在日期/时间字段)。

NULL值会导致几个问题。对于初学者来说,NULL值 与数据值不一样。 A NULL值基本上是一个未定义的 值。在ColdFusion的最后,这是 并不可怕,因为空值作为空字符串(最多 部分)出现在 之间。但是在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值和数据值之间的差异 ,这将使 更难调试您的代码。

底线:除非绝对必要,否则不要允许NULL值。 你只会让自己更难做作 。

+0

这让我更深入地思考了这种情况,并正在与流程负责人进行协商。也许我们可以将这一行从数据库中删除,除非他们需要知道当天没有进行测量。 – Sam 2010-04-15 19:33:10

+0

它们确实需要存储空值,或者至少存在值不可用的事实。 – Sam 2010-04-15 20:10:32

+0

@Sam没问题。我曾与我的同事讨论过,在某些情况下,空值可能是有用的,例如:如果学生没有参加考试,他们的考试分数将为零,而不是0.0作为考试成绩一个0.0就算失败,而不是没有完成考试,因此导致他们的平均数不一致。 – 2010-04-16 14:48:21

您需要问号?让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.0是一个值,num = Nothing是一个不为0.0的空值。 – CallMeLaNN 2010-04-15 18:06:43

+0

请注意,您不能仅分配null(或Nothing)以存储在数据库中。那就是为什么.Net有System.DBNull.Value。您需要执行If Else来存储System.DBNull.Value或正确的值。 – CallMeLaNN 2010-04-15 18:08:49

+0

使用你的语法给出“字符无效”。我正在使用VS 2005.也许这是一个更新的.net框架语法? – Sam 2010-04-15 20:13:55