如果VB.NET
我有DataRow
,我想測試一個列值是否爲Null
,我應該使用:應該使用IsDBNull和IsNull中的哪一個?
myDataRow.IsNull("Column1")
OR
IsDBNull(myDataRow("Column1"))
如果VB.NET
我有DataRow
,我想測試一個列值是否爲Null
,我應該使用:應該使用IsDBNull和IsNull中的哪一個?
myDataRow.IsNull("Column1")
OR
IsDBNull(myDataRow("Column1"))
發出SELECT
的時候,因爲我總是會用myDataRow.IsNull("Column1")
,如果值爲null
則返回爲null
而不是DBNull
。
爲什麼'null'返回'SELECT'語句?是否爲所有其他SQL語句返回了'DBNull'? – CJ7
@ CJ7,當它被放入屬性或數據行時,它被編組爲null。 –
使用IsDBNull
IsNull與IsDBNull有點不同。一個從所用數據庫檢查數據庫空值,另一個檢查空值。
處理DataRow數據時,最好使用IsDBNull()函數。 IsDBNull()的優點是,它檢查你的對象是否代表爲空,而不是簡單地將它本身爲空,這是一個重要的區別。當您詢問數據庫中爲空的數據行項目時,項目本身作爲對象存在,但它表示一個NULL值。如果你使用IsNull(),你會錯過NULL值。
.NET幾乎從不給你兩種方法來偶然地做同樣的事情。 DataRow.IsNull()更高效,它避免了必須檢索列值然後檢查IsDBNull。在內部它已經跟蹤了一列是否爲空,這是在行被創建時確定的。所以IsNull()可以快速地給你那非常的。因此它應該是你的偏好。
簡短回答:使用第一種方法,速度更快,因爲第一種方法使用預先計算的結果,而第二種方法需要在每次調用它時動態重新計算它。
龍答案:(你需要閱讀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);
}
由於dbNullBits
是BitArray
,這種操作非常迅速地完成。
現在考慮一下索引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
。這需要更多的計算,但更重要的是,每次執行檢查時都需要進行一些計算。這比使用預先計算的值要慢。
從數據庫設計和使用的角度來看,基於使用各種數據庫技術,包括SQL,DB2,OLAP,MOLAP,RDBMS,MDBMS,SPSS,IsNull是詢問列值的正確和可接受的方式,Essbase等等。根據定義,Null是沒有值的,未知的,Null甚至不等於Null,所以任何Null的附加只是一個方便的問題。
我做了一些發現,發現了一些有趣的事實,它們提供了更多關於DataRow.IsNull
或IsDBNull
的使用情況的信息。
DataRow.IsNull - 獲取一個值,該值指示指定的DataColumn是否包含空值。 Convert.IsDBNull - 返回指定對象是否爲DBNull類型的指示。
參考文獻:DataRow.IsNull和IsDBNull
,提供明確的結論,最有趣的討論可以從Performance Consideration
幾乎類似的討論可以得出是做得比較早,這裏引用:
Finding null value in dataset datarow isnull...
我認爲你給出的兩個例子在功能上是相同的 –