Zgodnie z dokumentacją MSDN dla DbCommand.ExecuteScalar:
Jeśli nie zostanie znaleziona pierwsza kolumna pierwszego wiersza w zestawie wyników, zwracane jest odwołanie anull (Nic w Visual Basic). Jeśli wartość w bazie danych jest null, zapytanie zwraca DBNull.Value.
Rozważ następujący fragment:
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();
}
W czasie wykonywania (testowane pod ODP.NET, ale powinno być takie samo pod dowolnym dostawcą ADO.NET), zachowuje się tak:
- Jeśli wiersz nie istnieje, wynik
command.ExecuteScalar()
ma wartość null, która jest następnie rzutowana na łańcuch o wartości null i przypisywana dogetusername
. - Jeśli wiersz istnieje, ale ma NULL w nazwie użytkownika (czy jest to w ogóle możliwe w Twojej bazie danych?), wynik
command.ExecuteScalar()
toDBNull.Value
, co skutkujeInvalidCastException
.
W każdym razie NullReferenceException
nie powinno być możliwe, więc Twój problem prawdopodobnie leży gdzie indziej.