2011-08-17 32 views
12

Trong chương trình của tôi, tôi đang lặp qua một datatable để lấy dữ liệu từ mỗi trường. Một dòng mã của tôi trông giống như sau:Chuyển đổi trường null thành 0 trước khi chuyển sang int?

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]); 

Về cơ bản, tôi chỉ lấy giá trị trong ô và chuyển đổi thành int32. Tuy nhiên, tôi gặp phải vấn đề khi dữ liệu trong trường là một giá trị rỗng. Tôi nhận được thông báo lỗi Truyền không hợp lệ về việc không thể chuyển đổi "DBNull" sang loại khác.

Vì vậy, tôi biết rằng tôi chỉ có thể kiểm tra giá trị của lĩnh vực này trước khi tôi cố gắng để chuyển đổi nó bằng cách làm một cái gì đó như thế này:

if (resultsDT.Rows[currentRow]["LYSMKWh"] == null) 
      { 
       resultsDT.Rows[currentRow]["LYSMKWh"] = 0; 
      } 

Nhưng, là có một cách tốt hơn để làm điều này? Có điều gì tôi có thể làm "nội tuyến" trong khi tôi đang cố gắng chuyển đổi giá trị mà không phải sử dụng số if?

EDIT: Tôi đã thử sử dụng phương pháp gợi ý này:

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? "0"); 

Thật không may, tôi vẫn nhận được thông báo lỗi Cast hợp lệ liên quan đến các loại DBNull. Nó đã được gợi ý rằng tôi có thể có vấn đề bằng cách sử dụng ?? toán tử nếu các loại ở hai bên khác nhau.

Ngoài ra, vì tôi có toàn quyền kiểm soát dữ liệu mà tôi đang xây dựng dữ liệu, tôi đã thay đổi nó để không có giá trị null nào được ghi vào bất kỳ trường nào. Vì vậy, điều đó phủ nhận rất nhiều sự cần thiết phải chuyển đổi một null thành một int32, trong trường hợp này. Cảm ơn tất cả các lời khuyên của mọi người!

Trả lời

9

Bạn có thể làm điều này:

var LYSMKWh = 
    resultsDT.Rows[currentRow]["LYSMKWh"].Equals(DBNull.Value) 
    ? 0 
    : Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"]); 
+0

Điều này thực sự làm việc khá tốt cho tôi. Tôi đã thử sử dụng các ví dụ dưới đây với ?? điều hành, nhưng tôi vẫn kết thúc nhận được thông báo lỗi Cast không hợp lệ. Từ những gì người dùng CodeNaked nói dưới đây, vấn đề có thể xảy ra khi sử dụng ?? nếu các loại ở hai bên khác nhau. – Kevin

3

Bạn có thể xem xét sử dụng toán tử ?? của C#, kiểm tra giá trị cho giá trị rỗng và nếu giá trị rỗng, gán giá trị mặc định cho nó.

+4

Một ví dụ sẽ được 'int LYSMKWh = Convert.ToInt32 (resultsDT.Rows [currentRow] [ "LYSMKWh"] ?? 0);' –

+0

rơi vào cùng một cái bẫy - chỉ khi loại resultsDt.Rows [...] [...] là int (hoặc bất kỳ số nào với tự động chuyển đổi từ 0) - nhưng sau đó Convert.ToInt32 sẽ là vô nghĩa - tôi đoán đó là một chuỗi ? – Carsten

+1

bạn là đúng .. nếu OP có quyền kiểm soát cơ sở dữ liệu, có thể anh ta có thể thiết lập nó để trả về null, và loại bỏ phần đầu tiên của mã (cái này lấy và chuyển đổi thành int) hoàn toàn. nó sẽ đi tốt ... –

0

Kiểm tra nếu nó DBNull.Value thay vì null:

if (resultsDT.Rows[currentRow]["LYSMKWh"] == DBNull.Value) 
{ 
    resultsDT.Rows[currentRow]["LYSMKWh"] = 0; 
} 

Khái niệm ternary sẽ làm việc như thế này:

var LYSMKwhField = resultsDT.Rows[currentRow]["LYSMKWh"]; 
int LYSMKWh = LYSMKwhField != DBNull.Value ? Convert.ToInt32(rowData) : 0; 
5

sử dụng ?? điều hành:

resultsDT.Rows[currentRow][...] ?? "0" 

(hy vọng lĩnh vực này là một chuỗi - nếu không thay đổi "0")

0

Bạn có thể sử dụng ?? điều hành:

object x = null; 

int i = (int)(x ?? 0) 
1

Bạn có thể thay thế nó với một nhà điều hành ternary:

var rowData = resultsDT.Rows[currentRow]["LYSMKWh"]; 
int LYSMKWh = rowData != null ? Convert.ToInt32(rowData) : 0; 

Ngoài ra, các nhà điều hành ?? có thể làm việc:

int LYSMKWh = Convert.ToInt32(resultsDT.Rows[currentRow]["LYSMKWh"] ?? 0); 

Nhưng tôi nghĩ đó là ít có thể đọc được.

+0

Tôi không biết, tôi giống như ví dụ thứ hai của bạn. Tôi chưa bao giờ sử dụng ?? nhà điều hành vì vậy tôi sẽ quan tâm để kiểm tra xem nó ra. – Kevin

+0

Ví dụ thứ hai của tôi cũng sẽ thực hiện chuyển đổi không cần thiết từ 0 thành 'int', điều này có thể hoặc không thể gây ra một số rắc rối về hiệu suất. Tôi không chắc chắn bạn mong đợi kiểu gì từ resultsDT, vì vậy bạn có thể phải đặt "0" thay vì chỉ 0 nếu bạn đang mong đợi một chuỗi, v.v. –

2

Bạn có thể sử dụng một phương pháp tùy chỉnh chuyển đổi:

public static int ConvertToInt32(object value, int defaultValue) { 
    if (value == null) 
     return defaultValue; 
    return Convert.ToInt32(value); 
} 

Bạn có thể cần quá tải mà lấy loại khác, như chuỗi. Bạn có thể gặp sự cố với toán tử ?? nếu các loại ở hai bên khác nhau.

+0

Tôi thích câu trả lời này. Bạn nói đúng, tôi đã chạy vào một vấn đề bằng cách sử dụng ?? toán tử (Tôi nhận được thông báo lỗi tương tự như trong OP của tôi). – Kevin

0

Bạn có thể sử dụng Phương thức tiện ích.

int LYSMKWh = resultsDT.Rows[currentRow]["LYSMKWh"].IfNullThenZero(); 

Tạo lớp dưới

public static class Converter 
{ 
    public static Int32 IfNullThenZero(this object value) 
    { 
     if (value == DBNull.Value) 
     { 
      return 0; 
     } 
     else 
     { 
      return Convert.ToInt32(value); 
     } 
    } 
} 
Các vấn đề liên quan