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.