2012-04-19 34 views
8

Tôi đọc cơ sở dữ liệu của mình bằng DataReader.C# Object null check

và một số hàng không có giá trị fdate.

vì vậy khi tôi chuyển đổi ngày không thành DateTime thì lỗi xảy ra.

Làm cách nào để kiểm tra trường trống?

AdsCommand cmd = conn.CreateCommand(); 
cmd.CommandText = "select name,fdate from abc"; 

AdsDataReader reader = cmd.ExecuteReader(); 

DateTime flsdate = (reader["fdate"].Equals(null))? Convert.ToDateTime(reader["fdate"]) : DateTime.Today; 

Tôi đã thử bằng Equals, nhưng nó không hoạt động.

ai biết cách kiểm tra đối tượng rỗng để tránh lỗi chuyển đổi?

Cảm ơn bạn!

+0

Sử dụng '==' hoặc '! =' Không '.Equals'. Ngoài ra, bạn có thể cần phải kiểm tra đối với 'DBNull', không chỉ là' null'. (Có, chúng khác nhau) .. – Servy

+0

Có thể trùng lặp? http://stackoverflow.com/questions/3432974/datareader-is-null-or-empty –

Trả lời

11

Khi mọi người chỉ cho bạn cách giải quyết vấn đề, tôi đang cố gắng cung cấp cho bạn thông tin về sự khác biệt giữa NULL và DBNull.

  • null và DBNull khác nhau.

  • null không phải là trường hợp thuộc bất kỳ loại nào. DBNull là một lớp đơn với một ví dụ: DBNull.Value.

  • null đại diện cho tham chiếu không hợp lệ trong đó DBNull.Value đại diện cho giá trị không tồn tại trong DB.

  • DBNull.Value là những gì nhà cung cấp db cung cấp cho giá trị không tồn tại trong bảng.

Với nền đó (reader["fdate"].Equals(null)) không đúng khi sử dụng tại đây. Bạn phải kiểm tra nó với DBNull.Value. Nếu nó thuộc loại DBNull hoặc nếu nó bằng DBNull.Value, thì hãy chỉ định giá trị bạn muốn.

+3

+1 để thực sự giải thích điều gì đó. Tôi đã tự do chỉnh sửa nó một chút; vui lòng quay lại bất kỳ thay đổi nào mà bạn không đồng ý. – phoog

+0

@phoog Cảm ơn bạn đã cải thiện nó. – Sandeep

2
DateTime flsdate = reader["fdate"].Equals(DBNull.Value) 
    ? Convert.ToDateTime(reader["fdate"]) 
    : DateTime.Today; 

Nhưng có vẻ như nguy hiểm để mặc định ngày thành Today. Tôi muốn làm điều này thay vì:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value) 
    ? Convert.ToDateTime(reader["fdate"]) 
    : (DateTime?)null; 

Hơn nữa, nếu TPE tiềm ẩn của cột fdate đã là DateTime, không sử dụng System.Convert:

DateTime? flsdate = reader["fdate"].Equals(DBNull.Value) 
    ? (DateTime?)reader["fdate"]) 
    : null; 
1

Hãy thử như sau:

DateTime flsdate = reader["fdate"] != null && reader["fdate"] != System.DbNull.Value 
    ? DateTime.ParseExact(reader["fdate"]) 
    : DateTime.Today; 
1
DateTime flsdate = DateTime.Today; 
if(reader["fdate"] != null) 
    flsdate = Convert.ToDateTime(reader["fdate"]) 
4

Trong một tình huống như thế này tôi muốn đại diện cho các cột cơ sở dữ liệu nullable với một trong hai loại tài liệu tham khảo (string cho varchar) hoặc một Nullable kiểu giá trị gói (DateTime?). Bằng cách này, bạn thể hiện chính xác hơn lược đồ cơ sở dữ liệu trong chương trình của mình.

này cũng cho phép bạn sạch hơn viết logic chuyển đổi bằng cách sử dụng định dạng: (? DateTime)

DateTime? fdate = datareader["fdate"] as DateTime?; 

diễn viên này sẽ thất bại trong trường hợp kết quả datareader là một DBNull và fdate sẽ được thiết lập để mặc định , là rỗng. Tại thời điểm đó bạn có thể có được giá trị mong muốn thực sự của bạn bằng cách kiểm tra xem loại nullable có giá trị hay không (fdate.HasValue), và nếu không, sử dụng mặc định của bạn - DateTime.Today.