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ề.
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
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