2008-08-15 14 views
13

Chúng tôi có ORM riêng của chúng tôi, chúng tôi sử dụng ở đây và cung cấp trình bao bọc mạnh mẽ cho tất cả các bảng db của chúng tôi. Chúng tôi cũng cho phép thực thi các câu lệnh ad-hoc SQL yếu, nhưng các truy vấn này vẫn đi qua cùng một lớp để nhận các giá trị từ một trình đọc dữ liệu.C# Cơ sở dữ liệu truy cập: DBNull vs null

Khi tinh chỉnh lớp đó để làm việc với Oracle, chúng tôi đã xem xét một câu hỏi thú vị. Có tốt hơn để sử dụng DBNull.Value, hoặc null? Có lợi ích gì khi sử dụng DBNull.Value không? Nó có vẻ "đúng" hơn để sử dụng null, vì chúng ta đã tách chúng ta khỏi thế giới DB, nhưng có những hàm ý (bạn không thể chỉ một cách mù quáng ToString() khi một giá trị là null chẳng hạn). ý thức quyết định về.

Trả lời

15

Tôi tìm thấy nó tốt hơn để sử dụng null, thay vì DB null.

Lý do là vì, như bạn đã nói, bạn đang tách mình khỏi thế giới DB.

Thực tiễn tốt là kiểm tra các loại tham chiếu để đảm bảo chúng không rỗng. Bạn sẽ được kiểm tra null cho những thứ khác hơn là dữ liệu DB, và tôi tìm thấy nó là tốt nhất để giữ tính thống nhất trên toàn hệ thống, và sử dụng null, không phải là DBNull.

Về lâu dài, về mặt kiến ​​trúc, tôi thấy đó là giải pháp tốt hơn.

3

Từ trải nghiệm tôi có, .NET DataTables và TableAdapters hoạt động tốt hơn với DBNull. Nó cũng mở ra một vài phương pháp đặc biệt khi được đánh mạnh, chẳng hạn như DataRow.IsFirstNameNull khi tại chỗ.

Tôi muốn tôi có thể cung cấp cho bạn câu trả lời kỹ thuật tốt hơn, nhưng đối với tôi, dòng dưới cùng là sử dụng DBNull khi làm việc với các đối tượng liên quan đến cơ sở dữ liệu và sau đó sử dụng null "chuẩn" khi xử lý đối tượng. NET liên quan đến mã.

1

Sử dụng DBNull.
Chúng tôi đã khắc phục một số vấn đề khi sử dụng null.
Nếu tôi nhớ chính xác, bạn không thể INSERT một giá trị null vào một trường, chỉ DBNull.
Chỉ có thể liên quan đến Oracle, xin lỗi, tôi không biết chi tiết nữa.

7

Nếu bạn đã viết ORM của riêng mình, thì tôi sẽ nói chỉ cần sử dụng null, vì bạn có thể sử dụng nó theo bất kỳ cách nào bạn muốn. Tôi tin rằng DBNull ban đầu được sử dụng chỉ để có được xung quanh thực tế là các loại giá trị (int, DateTime, vv) có thể không null, do đó, thay vì trả về một số giá trị như số không hoặc DateTime.Min, mà sẽ ngụ ý một null (xấu, xấu), họ tạo ra DBNull để chỉ ra điều này. Có lẽ còn nhiều hơn thế, nhưng tôi luôn cho rằng đó là lý do. Tuy nhiên, bây giờ chúng ta có các kiểu nullable trong C# 3.0, DBNull không còn cần thiết nữa. Trong thực tế, LINQ to SQL chỉ sử dụng null khắp nơi. Không có vấn đề gì cả. Embrace tương lai ... sử dụng null. ;-)

+0

Tôi nghĩ rằng vẫn còn một số sử dụng cho DBNull. Ít nhất với sqlite tôi có thể kiểm tra nếu một giá trị được trả về bởi ExecuteScalar() được lưu trữ rõ ràng trong cơ sở dữ liệu hay không. Xem xét Bảng foo (int, b int); với một hàng duy nhất (1, null). Nếu chúng ta ExecuteScalar trên một lệnh "SELECT b FROM foo WHERE A = 1", nó sẽ trả về DBNull.Value (hàng tồn tại một null được lưu trữ). Nếu tôi được gọi ExecuteScalar trên "SELECT b FROM foo WHERE A = 2" nó sẽ trả về null (không có hàng như vậy tồn tại). Có lẽ bạn có thể đạt được kết quả tương tự với một DataReader nhưng tôi đánh giá cao sự tiện lợi. – fostandy

+0

Thú vị. Trong khi sử dụng ORM để truy cập DB, tôi thường không sử dụng ExecuteScalar một cách rõ ràng trong mã của mình. Tôi thường kết thúc lấy các đối tượng thực thể đầy đủ và xem xét các giá trị của chúng theo cách đó. Vì vậy, nếu thực thể chính nó là null là một điều, và nếu giá trị là null, đó là một cái gì đó khác. Chỉ là những cách khác nhau để thực hiện nó.Tôi thừa nhận rằng ExecuteScalar hiệu quả hơn nếu bạn chỉ cần một giá trị duy nhất. – jeremcc