2011-06-17 26 views
9

Tôi có một sự nhầm lẫn chút với những điều sau đây:Khi chúng ta phải sử dụng DBNull.Value, null và "" trong C# .Net?

  1. Null
  2. DBNull.Value
  3. ""

Khi tôi sử dụng câu lệnh điều kiện OR trong khi gán giá trị, tôi là một chút chút bối rối với những thứ này. Đôi khi nó ném lỗi và một số lần nó hoạt động. Tôi muốn biết khi nào tôi muốn sử dụng những điều trên. Họ có cụ thể với các kiểu dữ liệu không? Tôi cần các đề nghị quý giá của bạn.

Trả lời

13

null là một trong hai điều:

  • một tài liệu tham khảo mà không thực điểm đến một đối tượng - chỉ là một "không có gì" chỉ số (về cơ bản, nó là giá trị 0 như một tài liệu tham khảo)
  • một struct Nullable<T>, mà hiện không có một giá trị (các HasValue bất động sản cũng sẽ trở lại false)

DBNull dành riêng cho một số bộ phận của ADO.NET để đại diện cho null trong cơ sở dữ liệu. Tôi chưa nghĩ ra lý do chính đáng tại sao họ không sử dụng thường xuyên null ở đây.

"" là chuỗi có độ dài bằng 0 - chuỗi hoàn toàn hợp lệ nhưng trống. Ý nghĩa của việc này là giữa các chuỗi null và một chuỗi "", các phương thức mẫu như value.Trim() sẽ hoạt động khác nhau; null.Trim() sẽ ném một ngoại lệ; "".Trim() chỉ là "". Nói chung, sử dụng string.IsNullOrEmpty(value) làm thử nghiệm làm cho sự khác biệt này biến mất.

+0

+1: Tôi không có kiến ​​thức đầu tiên về lý do tại sao cho DBNull, nhưng tôi thấy nó hữu ích cá nhân trong việc phân biệt giữa một đối tượng null trong bộ nhớ (mà là xấu cho tôi) và một giá trị null thích hợp trong cơ sở dữ liệu (mà tôi cần). Tôi chắc chắn rằng họ có thể đã xây dựng nó để sử dụng null cho cả hai, nhưng tôi thấy sự khác biệt hữu ích. –

+0

@Jelel đủ công bằng; Tôi đã không bao giờ có mặc dù, thật đáng buồn. Nó chỉ là một điều nữa cần nhớ ... 'param.Value = value ?? DBNull.Value; 'etc –

+0

@MarcGravell một trường hợp khi nó hữu ích, nằm trong giá trị trả về của SqlCommand.ExecuteScalar. null được trả về khi tập kết quả không có hàng nào. DBNull.Value được trả về khi có ít nhất một hàng, nhưng cột đầu tiên có một cơ sở dữ liệu NULL trong đó. –

12
  • null là nội bộ của ngôn ngữ và chỉ đơn giản có nghĩa là tham chiếu đối tượng hiện không đề cập đến một đối tượng thực. Về cơ bản, một sự khác biệt chính giữa các kiểu giá trị (int, bool, vv) và các kiểu tham chiếu (Object, bất kỳ lớp nào, vv) là các kiểu giá trị là một giá trị cụ thể trong bộ nhớ và các kiểu tham chiếu là một con trỏ tới biểu diễn của đối tượng. trong trí nhớ. Con trỏ đó đôi khi có thể trỏ đến, tốt, không có gì. Trong trường hợp đó là null. Về cơ bản nó có nghĩa là "Không có đối tượng C# tồn tại ở đây."

  • DBNull.Value hơi khác với mục đích làm việc với cơ sở dữ liệu. Cột cơ sở dữ liệu có thể chứa giá trị null. Tuy nhiên, khi dữ liệu đó được chọn vào một đối tượng (chẳng hạn như DataTable) trong mã, có một đối tượng ở đó để tham chiếu đến mức mã có liên quan. Tuy nhiên, đối tượng đó chứa một giá trị null từ cơ sở dữ liệu. Do đó, DBNull.Value tồn tại để thể hiện sự khác biệt đó. Về cơ bản nó có nghĩa là "Có một đối tượng C# ở đây đã lấy một giá trị từ một cơ sở dữ liệu, nhưng giá trị đó là null."

  • "" (hoặc string.Empty nếu bạn muốn sử dụng hằng số tích hợp cho điều đó) là giá trị hợp lệ. Nó tồn tại, không phải là null, theo mọi cách là string. Nó không có bất kỳ nhân vật nào trong đó.Một công cụ hữu ích để kiểm tra điều này là string.IsNullOrEmpty() để kiểm tra xem null hoặc chuỗi rỗng.

+1

"do đó bạn không cần phải khởi tạo một chuỗi mới trong bộ nhớ để giữ gì cả" - việc thực hiện làm cho việc này khá nhiều tranh luận. Tôi sẽ không nhấn mạnh sự khác biệt giữa '' ''và' string.Empty' –

+0

@Marc Gravell: Đúng vậy, nó được tối ưu hóa khá tốt vào thời điểm này. Những con thú cưng già chết cứng, tôi đoán vậy. – David

1

không áp dụng cho các giá trị C# null.

System.DBNull.value áp dụng cho các giá trị NULL cụ thể của cơ sở dữ liệu.

Khi bạn sử dụng ExecuteScalar() nó cho null nếu cột không tìm thấy hoặc trả về, nhưng cột được tìm thấy và giá trị là null ở đó thì nó trả về DBnull, có nghĩa là trong cột nếu giá trị là null, nếu sẽ trả về DBnull không null.

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