2009-02-11 16 views
7

Tôi cần một số lời khuyên về cách xử lý những điều sau: - Tôi có trường dữ liệu misc_text_2 là loại varchar (25) và cho phép VÔ GIÁ TRỊ. Bây giờ nếu tôi sử dụng cú pháp sauLàm cách nào để xử lý Chuyển đổi từ loại 'DBNull' thành loại 'Chuỗi' không hợp lệ

<asp:Label ID="lblPrinter" runat="server" Text='<%# iif(eval("misc_text_2") is dbnull.value, "", iif(eval("misc_text_2") like "NA", "None", iif(eval("misc_text_2") like "KP1", "Kitchen Printer 1", iif(eval("misc_text_2") like "KP2", "Kitchen Printer 2", iif(eval("misc_text_2") like "KP3", "Kitchen Printer 3", iif(eval("misc_text_2") like "BP1", "Bar Printer 1", iif(eval("misc_text_2") like "BP2", "Bar Printer 2", iif(eval("misc_text_2") like "BP3", "Bar Printer 3", Eval("misc_text_2")))))))))%>'></asp:Label> 

tôi tiếp tục nhận được một lỗi ngoại lệ chi tiết: System.InvalidCastException: Chuyển đổi từ loại 'DBNull' gõ 'String' là không hợp lệ.

Tôi biết tôi thiếu cái gì đó, nhưng những gì ...

Cảm ơn trước

+0

Ngôn ngữ/môi trường đó là gì? Tôi đoán ASP. Bạn có thể đề cập đến điều đó và gắn thẻ câu hỏi cho phù hợp không? –

Trả lời

-1

Bạn có thể trong sql của bạn sử dụng truy vấn IsNull (misc_text_2, '') để trở về en chuỗi rỗng thay vì DBNull .

+16

Không bao giờ trả lại các chuỗi rỗng ở vị trí của các giá trị rỗng, điều này làm giảm tính di động của tập dữ liệu của bạn và trình bày sai mô hình dữ liệu. Nếu đó là một null nó là một null. Hãy để lớp UI lo lắng về cách hiển thị nó. –

+1

Đó là ý kiến ​​của bạn. Trả lại một chuỗi rỗng giải quyết được vấn đề của mình, đúng không? –

+6

"Rỗng khác với null". Và đây không phải là một ý kiến, là một thực tế. –

13

Bạn phải kiểm tra rõ ràng DBNull.Value và tự thực hiện chuyển đổi.

Nói cách khác, hãy tạo phương thức sẽ thực hiện chuyển đổi cho bạn, lấy DBNull.Value vào tài khoản.

3

Không trả lời câu hỏi của bạn, nhưng: Bạn thực sự nên tạo một mã đằng sau phương thức thực hiện chuyển đổi. Điều đó sẽ làm cho mã dễ hiểu hơn và gỡ lỗi hơn, và sẽ làm cho nó có thể tái sử dụng mã.

0

Vì chúng tôi có một cơ sở dữ liệu kế thừa được thiết lập cho MS-Dynamics (Solomon), phương pháp xử lý null của chúng tôi là chuyển đổi chúng thành chuỗi rỗng trong mã ASP hoặc VB.NET. tức là

Trim$(misc_text_2 & " ") 

Loại bỏ vấn đề đối với mọi phiên bản VB.

+0

Bạn không cần 'Trim' nếu bạn sử dụng' "" 'thay vì' "" '. – CJ7

+0

Vẫn sử dụng cắt vì Dynamics chỉ sử dụng các trường kích thước cố định được điền trống. – Dave

2

Mỗi lần bạn sử dụng Eval, bạn phải Shim-trong việc đánh giá lười biếng, bằng cách nào đó. Để làm như vậy, hãy thay mỗi thể hiện của:

iif(eval("misc_text_2") like ...

với

iif(IsDbNull(eval("misc_text_2")) OrElse eval("misc_text_2") like ...

Các OrElse sẽ ngăn chặn bất kỳ chuyển đổi cố gắng của một DBNull để boolean. Tuy nhiên, từ một quan điểm cơ bản hơn, bang là chính xác nhất. Điều này tất cả nên được thực hiện code-behind, có lẽ trong xử lý sự kiện ItemDataBound (hoặc RowDataBound).

Khi phản ánh thêm ...

Các O.P. cũng có thể tận dụng các phương pháp Convert.ToString() trong mã của mình, mà sẽ chuyển đổi DBNulls để String.Empty.

0

Nếu bạn đang sử dụng thiết kế bộ dữ liệu, cách dễ nhất để thoát khỏi lỗi này là để thay đổi các thuộc tính của cột tôn trọng.

NullValue ngoại lệ đối với "Empty" thay vì "ngoại lệ Ném".

hy vọng điều này sẽ giúp ích cho bạn.

0

Đối với chuyển đổi DBNull hoặc IsDBNull bạn có thể thử cách này:

  1. Chuyển đổi DBNull để một chuỗi rỗng

    (DBNullObj) ToString

  2. Tạo một Function DBNull Chuyển đổi

    Chức năng công cộng ConvertDBNullToString (DBNullObj As Object) thành chuỗi

    nếu IsDBNull (DBNullObj) sau đó

    trở lại ""

    kết thúc nếu

    trở DBNullObj

    End Function

0

Như spiritUMTP gợi ý, nếu bạn đang sử dụng Dataset Thiết kế, thay đổi DataColumn.NullValue từ "Throw exception" thành "empty" hoặc "Nothing". Tôi đã chọn cái sau, và nó đã khắc phục được vấn đề. Bây giờ tôi chỉ kiểm tra Không có gì (Nếu IsNothing (columnFax) thì ...)

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