Podle dokumentace MSDN pro DbCommand.ExecuteScalar:
Pokud není nalezen první sloupec prvního řádku v sadě výsledků, je vrácena nulová reference (Nothing in Visual Basic). Pokud je hodnota v databázi null, dotaz vrátí DBNull.Value.
Zvažte následující úryvek:
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();
}
Za běhu (testováno pod ODP.NET, ale mělo by být stejné u jakéhokoli poskytovatele ADO.NET) se chová takto:
- Pokud řádek neexistuje, výsledek
command.ExecuteScalar()
je null, který je pak přetypován na nulový řetězec a přiřazen kgetusername
. - Pokud řádek existuje, ale má v uživatelském jménu hodnotu NULL (je to ve vaší databázi vůbec možné?), výsledek
command.ExecuteScalar()
jeDBNull.Value
, což má za následekInvalidCastException
.
V každém případě NullReferenceException
by nemělo být možné, takže váš problém je pravděpodobně jinde.