2012-11-30 15 views
8

Khi tôi thêm tham số SQL p vào bộ sưu tập, tôi nhận được InvalidCastException với thông báo từ tiêu đề bài đăng.SqlParameterCollection chỉ chấp nhận các đối tượng kiểu SqlParameter không null, không phải đối tượng DBNull

parentId là số nguyên nullable và số nguyên có thể null trong cơ sở dữ liệu.

Tại sao tôi nhận được ngoại lệ này và cách tôi có thể giải quyết ngoại lệ?

Tôi không sử dụng các thủ tục đã lưu và tôi đã đọc các chủ đề tương tự nhưng chúng không giúp tôi.

var p = new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value; 
cmd.Parameters.Add(p); 
+0

-2? pfffhhhhh ... – Elisabeth

+0

Không chắc chắn tại sao điều này lại bị giảm giá. Đó là một câu hỏi được viết tốt với mã tái tạo vấn đề. – vcsjones

+0

@Thanks vcsjones để giúp tôi :) – Elisabeth

Trả lời

14

Bạn không thêm new SqlParameter. p là kết quả của new SqlParameter("ParentId", SqlDbType.Int).Value = parentId ?? (object) DBNull.Value. Nói cách khác, p chính nó là DBNull.Value.

Chia tuyên bố trong hai, như vậy:

var p = new SqlParameter("ParentId", SqlDbType.Int); 
p.Value = parentId ?? (object) DBNull.Value; 
cmd.Parameters.Add(p); 

Ngoài ra,

var p = new SqlParameter("ParentId", SqlDbType.Int) { Value = parentId ?? (object) DBNull.Value }; 
cmd.Parameters.Add(p); 

Hoặc sẽ đảm bảo p là tham số, chứ không phải giá trị của tham số.

+0

Hoặc bạn chỉ có thể sử dụng dấu ngoặc đơn: 'var p = new SqlParameter (" ParentId ", SqlDbType.Int) .Value = (parentId ?? (đối tượng) DBNull)' – phoog

+0

@phoog Điều đó sẽ có nghĩa là điều tương tự (tốt, nếu bạn thêm '.Value' sau' DBNull'), do đó, vẫn không hoạt động. – hvd

+0

Ồ vâng, tôi hiểu. Nó phải là chiều thứ Sáu. – phoog

-2

Bạn cần phải sử dụng:

System.Data.SqlTypes.SqlInt32.Null