Tôi chỉ phải tìm một giải pháp cho việc này. Tôi cần phải thay đổi một số mã cũ cho một trang web, được viết cho ASP.NET 2.0. Trang sử dụng Telerik RadMenu, một điều khiển menu. Thành phần này yêu cầu các phần tử gốc có giá trị DBNull thích hợp (cho các parentID). Vì vậy, khi tôi biên soạn mã cũ, thành phần RadMenu đã cho tôi rất nhiều vấn đề. Ngoại lệ đầu tiên liên quan đến Ràng buộc, sau đó nó không hiểu được yếu tố nào là yếu tố gốc và toàn bộ điều trông khủng khiếp.
Nhưng tôi đã giải quyết nó và đây là những gì làm việc cho tôi.
Trong trang Properties của cột ParentID trong thiết kế Bảng Adapter, tôi đã sử dụng: - AllowDBNull: true - DefaultValue: -1 (-1 là một giá trị mà không xảy ra thường cho cột đó) THe NullValue -property ở lại "Ném ngoại lệ" vì nó không thể thay đổi cho tôi.
Và trong mã sử dụng các giá trị từ bộ điều hợp bảng, tôi đã sử dụng cấu trúc này (VB.Mã NET, không phải C#, vì câu hỏi này được gắn thẻ):
Dim MenuBarTable As DAL.Page.MenuBarDataTable 'The Table Adapter
MenuBarTable = PageObj.GetMenuBar() 'The generated Get function
MenuBarTable.ParentIDColumn.AllowDBNull = True
For Each row As Page.MenuBarRow In MenuBarTable.Rows
If row.IsParentIDNull() Then
row.SetParentIDNull()
End If
Next
Mã được tạo cho bộ điều hợp bảng tạo hai chức năng cho mỗi cột cho phép DBNULL. Chúng có nghĩa là được sử dụng khi giao dịch với NULL, nhưng nó là một giải pháp vụng về của Microsoft. Điều xảy ra đằng sau hậu trường là bộ điều hợp bảng sẽ xuất ra DefaultValue của cột thay vì NULL từ hàm Get-function. Tôi gọi đó là "mô phỏng NULL" hoặc "giả mạo NULL".
Hàm IsParentIDNull() thực sự sẽ kiểm tra xem hàng có chứa "NULL giả" này không, ví dụ: DefaultValue của cột, và khi đó, tôi chèn một DBNull thích hợp bằng cách sử dụng hàm SetParentIDNull().
Giải pháp này làm việc cho tôi, nhưng không phải là rất thanh lịch, cũng không phải là rất hiệu quả, nhưng nó có thể giúp đỡ cho người khác, tôi hy vọng.
Bạn có thể sửa đổi định nghĩa thuộc tính hàng trong tệp .Designer của DataSet cho bảng, nhưng có vẻ như nó được tạo lại mỗi khi DataSet được sửa đổi thông qua trình thiết kế VS, ngay cả khi bạn không chạm vào bảng cụ thể. –