2010-04-15 55 views
2

我正在研究從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

回答

4

我不知道你使用哪個API來做數據庫插入,但是包括ADO.NET在內的許多API,插入NULL值的正確方法是使用DBNull.Value。所以我的建議是,你在你的VB代碼中使用了Nullable(Of Double),但是當它開始插入時,你會用DBNull.Value替換任何空值。

0

我發佈文章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

3

您需要問號?讓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