2011-08-09 3 views
6

Tôi hiện đang làm việc trên dự án C# sẽ xuất Dữ liệu MySQL. Xuất khẩu là cho bất kỳ cơ sở dữ liệu trong máy chủ vì vậy tôi sẽ không biết những gì các lĩnh vực và các loại dữ liệu có trong bảng và tôi sẽ không biết nếu một lĩnh vực trong bảng cho phép giá trị null hay không.MySQLDataReader truy xuất vấn đề giá trị Null trong C#

Trong khi thử nghiệm, tôi nhận thấy rằng quá trình xuất đang hoạt động tốt nhưng nếu trường cho phép null khi trình đọc dữ liệu mysql được chuyển tới hàng rỗng, nó sẽ hiển thị lỗi SqlNullValueException, dữ liệu là rỗng.

Tôi đã thử thực hiện if (reader.getString(field) == null) {} nhưng vẫn hiển thị lỗi.

Làm cách nào để đối phó với các giá trị Null trong cơ sở dữ liệu.

Cảm ơn bạn đã trợ giúp bạn có thể cung cấp.

Trả lời

17

Bạn cần phải kiểm tra cho null rõ ràng trong một độc giả như vậy:

if (!reader.IsDbNull(field)) { 
    var value = reader.GetString(field); 
    // ... do stuff here ... 
} 
+0

cảm ơn sự giúp đỡ của bạn – Boardy

+0

Không nên là '.IsDbNull (reader [" field "])'? Hoặc là tôi sai? – Hossein

+2

Phụ thuộc vào phương pháp triển khai/trợ giúp người đọc. Bạn sẽ được quyền rằng IDataReader giao diện cơ sở chỉ mất các chỉ số cột số nguyên. MySqlDataReader tuy nhiên có quá tải để lấy một tên trường chuỗi, mà chỉ cần một người đọc.GetOrdinal tra cứu. – Nicholi

2

Net không sử dụng một null đen để phân biệt null cơ sở dữ liệu. Tôi chỉ có thể suy đoán, nhưng tôi nghi ngờ lý do cho điều này là nhiều kiểu cột cơ sở dữ liệu phổ biến (int, float, vv) là các kiểu giá trị, và so sánh một kiểu giá trị với null sẽ không hoạt động theo cách bạn mong đợi. Thay vào đó, hãy kiểm tra DBNull.Value hoặc sử dụng chức năng .IsDbNull().

1

Tôi đã gặp sự cố khi sử dụng phương thức GetString() trên các trường cho phép giá trị null. Tôi làm việc này bằng cách làm một cái gì đó như:

reader[0].ToString()

3

Trong blog của bài viết này có một phương pháp khuyến nông tốt cho người đọc

SQL Data Reader - handling Null column values

tôi thay đổi nó vào IDataReader Interface

public static string GetStringSafe(this IDataReader reader, int colIndex) 
    { 
     return GetStringSafe(reader, colIndex, string.Empty); 
    } 

    public static string GetStringSafe(this IDataReader reader, int colIndex, string defaultValue) 
    { 
     if (!reader.IsDBNull(colIndex)) 
      return reader.GetString(colIndex); 
     else 
      return defaultValue; 
    } 

    public static string GetStringSafe(this IDataReader reader, string indexName) 
    { 
     return GetStringSafe(reader, reader.GetOrdinal(indexName)); 
    } 

    public static string GetStringSafe(this IDataReader reader, string indexName, string defaultValue) 
    { 
     return GetStringSafe(reader, reader.GetOrdinal(indexName), defaultValue); 
    } 
+1

bạn đúng là một phần mở rộng tốt hơn thay vì làm điều tương tự tất cả các mã – MrAlex6204

1

Bạn luôn có thể sử dụng toán tử điều kiện C# '?' giống như vậy ...

string val = (reader.IsDBNull(columnIndex)) ? "" : reader.GetString(columnIndex);