Volgens MSDN-documentatie voor DbCommand.ExecuteScalar:
Als de eerste kolom van de eerste rij in de resultatenset niet wordt gevonden, wordt een anull-verwijzing (Niets in Visual Basic) geretourneerd. Als de waarde in de database null is, retourneert de query DBNull.Value.
Beschouw het volgende 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();
}
Tijdens runtime (getest onder ODP.NET maar zou hetzelfde moeten zijn onder elke ADO.NET-provider), gedraagt het zich als volgt:
- Als de rij niet bestaat, het resultaat van
command.ExecuteScalar()
is null, die vervolgens wordt gecast naar een null-tekenreeks en wordt toegewezen aangetusername
. - Als de rij bestaat, maar NULL in gebruikersnaam heeft (is dit zelfs mogelijk in uw DB?), het resultaat van
command.ExecuteScalar()
isDBNull.Value
, wat resulteert in eenInvalidCastException
.
In ieder geval de NullReferenceException
zou niet mogelijk moeten zijn, dus uw probleem ligt waarschijnlijk ergens anders.