Theo tài liệu MSDN cho DbCommand.ExecuteScalar:
Nếu không tìm thấy cột đầu tiên của hàng đầu tiên trong tập kết quả, thì tham chiếu rỗng (Không có gì trong Visual Basic) được trả về. Nếu giá trị trong cơ sở dữ liệu là null, truy vấn trả về DBNull.Value.
Hãy xem xét đoạn mã sau:
using (var conn = new OracleConnection(...)) {
conn.Open();
var command = conn.CreateCommand();
command.CommandText = "select username from usermst where userid=2";
string getusername = (string)command.ExecuteScalar();
}
Tại thời điểm chạy (được thử nghiệm trong ODP.NET nhưng phải giống với bất kỳ nhà cung cấp ADO.NET nào), nó hoạt động như sau:
- Nếu hàng không tồn tại, kết quả của
command.ExecuteScalar()
là null, sau đó được chuyển thành chuỗi null và được gán chogetusername
. - Nếu hàng tồn tại, nhưng có NULL trong tên người dùng (thậm chí điều này có thể xảy ra trong DB của bạn?), kết quả của
command.ExecuteScalar()
làDBNull.Value
, dẫn đếnInvalidCastException
.
Trong mọi trường hợp, NullReferenceException
không thể, vì vậy vấn đề của bạn có thể nằm ở chỗ khác.