2013-07-09 29 views
14

Nếu trong VB.NET Tôi có DataRow và tôi muốn kiểm tra xem một giá trị cột là Null, tôi nên sử dụng:Nên sử dụng IsDBNull và IsNull nào?

myDataRow.IsNull("Column1") 

HOẶC

IsDBNull(myDataRow("Column1")) 
+0

Tôi nghĩ hai ví dụ bạn đã cung cấp có chức năng giống hệt nhau –

Trả lời

0

tôi sẽ luôn luôn sử dụng myDataRow.IsNull("Column1") vì khi phát hành một SELECT, nếu giá trị là null, giá trị này được trả lại là null và không phải là DBNull.

+0

Tại sao 'null' được trả lại cho câu lệnh' SELECT'? 'DBNull' có được trả lại cho tất cả các câu lệnh SQL khác không? – CJ7

+0

@ CJ7, nó được sắp xếp thành một giá trị rỗng khi nó được đưa vào một thuộc tính hoặc một hàng dữ liệu. –

0

Sử dụng IsDBNull IsNull hơi khác so với IsDBNull. Một kiểm tra cho một giá trị DB Null từ cơ sở dữ liệu được sử dụng và khác, tốt, chỉ cần Null.

0

Khi xử lý dữ liệu DataRow, lý tưởng là sử dụng hàm IsDBNull(). IsDBNull() có lợi thế là nó kiểm tra nếu đối tượng của bạn đại diện cho một null, thay vì chỉ đơn giản là null, và đó là một sự khác biệt quan trọng. Khi bạn thẩm vấn một mục hàng dữ liệu rỗng trong cơ sở dữ liệu, mục đó tồn tại như một đối tượng, nhưng nó đại diện cho một giá trị NULL. Nếu bạn sử dụng IsNull(), bạn sẽ bỏ lỡ các giá trị NULL.

8

.NET hầu như không bao giờ cung cấp cho bạn hai cách để làm điều tương tự một cách tình cờ. DataRow.IsNull() hiệu quả hơn, nó tránh phải lấy giá trị cột và sau đó kiểm tra IsDBNull. Bên trong nó đã theo dõi xem một cột có null hay không, được xác định khi hàng được tạo. Vì vậy, IsNull() có thể cung cấp cho bạn rằng rất nhanh chóng. Do đó, nó sẽ là sở thích của bạn.

16

Câu trả lời ngắn: sử dụng cách thứ nhất, nhanh hơn, vì phương pháp đầu tiên sử dụng kết quả được tính trước, trong khi phương pháp thứ hai cần tính lại nó mỗi khi bạn gọi.

Long trả lời: (bạn cần phải đọc mã C# để hiểu phần này; MS đang framework cung cấp trong C#, nhưng lập trình viên VB sẽ có thể để có được những ý tưởng chung của những gì đang xảy ra)

Đây là những gì xảy ra bên trong IsNull tiếng gọi của DataRow:

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

các column.IsNull thực hiện một sự khẳng định nhanh chóng, và chuyển tiếp cuộc gọi đến DataStorage, một lớp học nội:

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

Cuối cùng, đây là những gì _storage.IsNull làm:

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

Kể từ dbNullBits là một BitArray, thao tác này hoàn thành rất nhanh chóng.

Bây giờ xem xét những gì indexer myDataRow("Column1") không (bạn gọi indexer này trước khi đi qua kết quả của nó để IsDBNull):

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

Lưu ý rằng hai dòng đầu tiên của IsNull phương pháp và indexer là giống hệt nhau. Tuy nhiên, ba hàng tiếp theo cần thực hiện xác thực và tìm nạp chính giá trị đó.Chỉ sau đó mã của bạn mới có thể bắt đầu tính toán giá trị đích của nó - một lá cờ cho biết giá trị là DBNull hay không. Điều này đòi hỏi tính toán nhiều hơn, nhưng quan trọng hơn, nó đòi hỏi một số tính toán mỗi khi bạn thực hiện kiểm tra. Điều này chậm hơn so với sử dụng giá trị được tính trước.

0

Từ thiết kế cơ sở dữ liệu và quan điểm sử dụng, IsNull là cách chính xác và được chấp nhận để thẩm định giá trị của cột, dựa trên việc sử dụng các công nghệ cơ sở dữ liệu khác nhau bao gồm SQL, DB2, OLAP, MOLAP, RDBMS, MDBMS, SPSS , Essbase, vv Theo định nghĩa Null là sự vắng mặt của một giá trị, một không xác định, và Null thậm chí không bằng Null, do đó, bất kỳ hỗ trợ cho Null chỉ là một vấn đề thuận tiện.

2

Tôi đã thực hiện một số phát hiện và tìm thấy các sự kiện thú vị cung cấp thông tin chi tiết hơn về cách sử dụng DataRow.IsNull HOẶC IsDBNull.

DataRow.IsNull - Nhận giá trị cho biết liệu DataColumn được chỉ định có chứa giá trị null hay không. Convert.IsDBNull - Trả về một chỉ báo cho dù đối tượng được chỉ định có thuộc loại DBNull hay không.

Tài liệu tham khảo: DataRow.IsNullIsDBNull

Các cuộc thảo luận thú vị nhất mà cung cấp kết luận rõ ràng có thể được rút ra từ Performance Consideration

thảo luận Gần tương tự đã được thực hiện trước đó, đây là tài liệu tham khảo:

Finding null value in dataset datarow isnull...

Most efficient way to check for dbnull...

Avoid checking for datarow isdbnull...

Các vấn đề liên quan