2011-10-28 34 views
9

Tôi đang cố gắng thêm một cột vào một hiện tại DataRow trong C#. Sau đó, cột sẽ được lấp đầy với một giá trị duy nhất từ ​​cơ sở dữ liệu của tôi.ExecuteScalar trả về null hoặc DBNull (máy chủ phát triển hoặc sản xuất)

DataRow dr đã tồn tại và cột "COLNAME" cũng tồn tại.
comTBP là số SqlCommand của tôi.

dr["COLNAME"] = Convert.ToInt32(comTBP.ExecuteScalar()); 

Tất cả đều hoạt động tốt nếu có giá trị trong cơ sở dữ liệu và ExecuteScalar() có thể nhận được giá trị đó. Nếu tôi kiểm tra mã này trên máy chủ phát triển của tôi (local) nó cũng hoạt động nếu ExecuteScalar() trả về null hoặc DBNull và giá trị của cột mới của tôi là 0. Nhưng vấn đề xuất hiện nếu tôi triển khai mã của tôi đến máy chủ sản xuất. Nếu tôi làm tất cả mọi thứ như nhau, với cùng một cơ sở dữ liệu nó ném một ngoại lệ với một thông điệp rằng nó không thể chuyển đổi DBNull để Int32.
Câu hỏi của tôi là tại sao lỗi này xuất hiện trên máy chủ sản xuất chứ không phải trên máy chủ phát triển cục bộ của tôi?

+1

dữ liệu có khả năng khác nhau Hầu hết về sản xuất và phát triển. – leppie

Trả lời

7

Rõ ràng trong quá trình sản xuất, bạn có một số NULL được trả lại từ việc thực thi lệnh hoặc điều gì đó khác trong chuỗi kết nối hoặc bất kỳ thứ gì; như một quy tắc chung, bạn nên luôn kiểm tra DBNull trước khi truyền/chuyển đổi trực tiếp sang loại khác kết quả là ExecuteScalar.

Kiểm tra Rein của câu trả lời ở đây (và bầu ông lên) cho giải pháp gợi ý đẹp của mình:

Unable to cast object of type 'System.DBNull' to type 'System.String`

+1

'Convert.ToInt32' từ' null' kết quả bằng 0. –

+0

Sau đó, hoặc anh ta không nói tất cả sự thật hoặc bạn sai ;-) Tôi có vấn đề tương tự trong quá khứ và giải quyết bằng cách luôn kiểm tra DBNULL trước khi chuyển đổi/đúc –

+1

Tôi biết nó trả về NULL trong sản xuất .. nó cũng trả về NULL trong phát triển bởi vì nó cùng một DB. Câu hỏi của tôi là tại sao nó trả về NULL trong phát triển và ** DBNull ** trong sản xuất? Trong quá trình phát triển, việc truyền từ NULL sang Int32 sẽ dẫn đến 0 nhưng trong quá trình sản xuất, nó cố gắng truyền từ DBNull sang Int32 và ném ngoại lệ – Yoni

17

ExecuteScalar lợi nhuận DBNull cho giá trị null từ querynull cho kết quả không. Có thể trên máy chủ phát triển của bạn, nó không bao giờ xảy ra (null kết quả từ query).

2

Sử dụng hàm ISNULL() trong SQL của bạn.

ISNULL (check_expression, replacement_value)

tức ...

CHỌN ISNULL (SUM (Price), 0) TỪ tự

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