2013-07-09 31 views
14

如果VB.NET我有DataRow,我想測試一個列值是否爲Null,我應該使用:應該使用IsDBNull和IsNull中的哪一個?

myDataRow.IsNull("Column1") 

OR

IsDBNull(myDataRow("Column1")) 
+0

我認爲你給出的兩個例子在功能上是相同的 –

回答

0

發出SELECT的時候,因爲我總是會用myDataRow.IsNull("Column1"),如果值爲null則返回爲null而不是DBNull

+0

爲什麼'null'返回'SELECT'語句?是否爲所有其他SQL語句返回了'DBNull'? – CJ7

+0

@ CJ7,當它被放入屬性或數據行時,它被編組爲null。 –

0

使用IsDBNull IsNull與IsDBNull有點不同。一個從所用數據庫檢查數據庫空值,另一個檢查空值。

0

處理DataRow數據時,最好使用IsDBNull()函數。 IsDBNull()的優點是,它檢查你的對象是否代表爲空,而不是簡單地將它本身爲空,這是一個重要的區別。當您詢問數據庫中爲空的數據行項目時,項目本身作爲對象存在,但它表示一個NULL值。如果你使用IsNull(),你會錯過NULL值。

8

.NET幾乎從不給你兩種方法來偶然地做同樣的事情。 DataRow.IsNull()更高效,它避免了必須檢索列值然後檢查IsDBNull。在內部它已經跟蹤了一列是否爲空,這是在行被創建時確定的。所以IsNull()可以快速地給你那非常的。因此它應該是你的偏好。

16

簡短回答:使用第一種方法,速度更快,因爲第一種方法使用預先計算的結果,而第二種方法需要在每次調用它時動態重新計算它。

龍答案:(你需要閱讀C#代碼來了解這部分;在C#MS用品框架代碼,但VB程序員應該能夠得到什麼回事的總體思路)

這裏什麼IsNull通話DataRow內發生的:

public bool IsNull(string columnName) { 
    DataColumn column = GetDataColumn(columnName); 
    int record = GetDefaultRecord(); 
    return column.IsNull(record); 
} 

column.IsNull執行快速斷言,並調用轉發給DataStorage,一個內部類:

internal bool IsNull(int record) { 
    Debug.Assert(null != _storage, "no storage"); 
    return _storage.IsNull(record); 
} 

最後,這裏是什麼_storage.IsNull做:

public virtual bool IsNull(int recordNo) { 
    return this.dbNullBits.Get(recordNo); 
} 

由於dbNullBitsBitArray,這種操作非常迅速地完成。

現在考慮一下索引myDataRow("Column1")不(你路過它的結果之前調用這個索引到IsDBNull):

get { 
    DataColumn column = GetDataColumn(columnName); 
    int record = GetDefaultRecord(); 
    _table.recordManager.VerifyRecord(record, this); 
    VerifyValueFromStorage(column, DataRowVersion.Default, column[record]); 
    return column[record]; 
} 

注意IsNull方法和索引的前兩行是相同的。但是,後面的三行需要執行驗證,並獲取值本身。只有在這之後,你的代碼才能開始計算它的目標值 - 一個標誌,告訴它該值是否爲DBNull。這需要更多的計算,但更重要的是,每次執行檢查時都需要進行一些計算。這比使用預先計算的值要慢。

0

從數據庫設計和使用的角度來看,基於使用各種數據庫技術,包括SQL,DB2,OLAP,MOLAP,RDBMS,MDBMS,SPSS,IsNull是詢問列值的正確和可接受的方式,Essbase等等。根據定義,Null是沒有值的,未知的,Null甚至不等於Null,所以任何Null的附加只是一個方便的問題。

2

我做了一些發現,發現了一些有趣的事實,它們提供了更多關於DataRow.IsNullIsDBNull的使用情況的信息。

DataRow.IsNull - 獲取一個值,該值指示指定的DataColumn是否包含空值。 Convert.IsDBNull - 返回指定對象是否爲DBNull類型的指示。

參考文獻:DataRow.IsNullIsDBNull

,提供明確的結論,最有趣的討論可以從Performance Consideration

幾乎類似的討論可以得出是做得比較早,這裏引用:

Finding null value in dataset datarow isnull...

Most efficient way to check for dbnull...

Avoid checking for datarow isdbnull...