2013-08-28 55 views
4

我有下面的代碼插入一些數據到Access表中。它開始於一個逗號分隔的線,我分成一個字符串數組,然後添加數組元素作爲參數:INSERT查詢 - 空與空字符串..它有關係嗎?

string line = "one\ttwo\t\tfour"; 

string[] values = line.Split('\t'); 

using (OleDbCommand com = new OleDbCommand("INSERT INTO [MyTable] (" + 
    "[Field1], [Field2], [Field3], [Field4] " 
    ") VALUES (" + 
    "?, ?, ?, ?" + 
    ")", con)) 
{ 
    com.Parameters.Add("@p0", OleDbType.Char, 255).Value = (object)values[0] ?? DBNull.Value; 
    com.Parameters.Add("@p1", OleDbType.Char, 255).Value = (object)values[1] ?? DBNull.Value; 
    com.Parameters.Add("@p2", OleDbType.Char, 255).Value = (object)values[2] ?? DBNull.Value; 
    com.Parameters.Add("@p3", OleDbType.Char, 255).Value = (object)values[3] ?? DBNull.Value; 

    com.ExecuteNonQuery(); 
} 

在上述例子中,@p2不會有一個值。它被作爲空值插入到Access表中,而不是空值。至少我認爲我正確地解釋了這一點。如果我查詢了Field3 is Null,我沒有收到任何結果。如果我查詢Field3 = "",我確實得到了結果。它是空白還是空白?是否有'首選'選項?

謝謝!

+1

精確的術語是**零長度字符串**或**空字符串**,不是空白。另外,你爲什麼使用字符串連接來寫SQL而不是多行字符串? –

+2

感謝您的澄清。關於連接與多行,我真的沒有一個好的答案。但是,在剛剛閱讀了關於多行字符串的更多內容之後,我將開始使用這些字符串! –

回答

1

聲明原文:

com.Parameters.Add("@p2", OleDbType.Char, 255).Value = (object)values[2] ?? DBNull.Value; 

從它從values[2]發送空字符串 '' 的描述,而不是DBNull.Value 。我會明確地轉換爲空字符串(或空),而不是使用空合併運算符(?):

com.Parameters.Add("@p2", OleDbType.Char, 255).Value = String.IsNullOrEmpty(values[2]) ? DBNull.Value : values[2]; 

新增:由於型號規格(OleDbType.Char)爲防止這種發送爲DBNull到數據庫中,我將回到AddWithValue

com.Parameters.AddWithValue("@p2", String.IsNullOrEmpty(values[2]) ? DBNull.Value : values[2]); 

這不指定類型,因此應該接受DBNull或字符串。無論如何,我更喜歡這種方法:如果我們指定類型,我們需要確保它與字段數據類型完全一致 - >讓C#解決這個問題。

+0

只是我的看法,但是稍後閱讀此代碼時,我會發現'values'這個名稱有點令人困惑,並且更喜歡一些更具描述性的內容。 –

+0

我試過這個,並得到一個錯誤'無法確定條件表達式的類型,因爲'System.DBNull'和'String''之間沒有隱式轉換。我同意'價值'這個東西。當一個簡單的小應用程序很快失去控制時,什麼開始了。我打算在某個時候重寫它。 –

+0

我已經添加到我的答案。 –

2

那麼,null絕對不是一個空字符串相同。所以,是的,這很重要。但只限於你的域名。換句話說,如果該字段不是真的可以爲空,並且Access將DBNull.Value解釋爲空字符串,那麼在查找沒有值的行時,您只需要記住這一點。如果該列在Access中可以爲空,則不會看到此行爲。

但是,如果字段爲空,那麼我會建議你實際上只發送null而不是DBNull.Value。所以,換句話說:

values[0]; 

代替:

(object)values[0] ?? DBNull.Value; 
+0

我試過'values [2]'而不是'(object)values [2] ?? DBNull.Value',但我仍然得到一個插入Field3的空字符串。在創建表格時,我使用'[Field3] Text(255)NULL'來創建這個特定的字段。我錯過了別的嗎? –

+0

糾正我,如果我錯了,但SQL NULL沒有定義爲NET'null',因此'DBNull'類型相同。如果你從MS SQL中返回NULL,與.NET null比較可能無法正確比較,'DBNull'糾正了這個錯誤。但是,您可以將'null'傳遞給EF方法,EF將用這個值'做正確的事情'。實際上,這是創建'struct Nullable '後面的主要動機,因此您可以使用可爲null的int和bools來設置可爲空的數據庫列。 – fourpastmidnight