Secondo la documentazione MSDN per DbCommand.ExecuteScalar:
Se la prima colonna della prima riga nel set di risultati non viene trovata, viene restituito un riferimento nullo (Nothing in Visual Basic). Se il valore nel database è null, la query restituisce DBNull.Value.
Considera il seguente snippet:
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();
}
In fase di esecuzione (testato in ODP.NET ma dovrebbe essere lo stesso in qualsiasi provider ADO.NET), si comporta in questo modo:
- Se la riga non esiste, il risultato di
command.ExecuteScalar()è null, che viene quindi convertito in una stringa nulla e assegnato agetusername. - Se la riga esiste, ma ha NULL nel nome utente (è possibile anche nel tuo DB?), il risultato di
command.ExecuteScalar()èDBNull.Value, risultando in unInvalidCastException.
In ogni caso, la NullReferenceException non dovrebbe essere possibile, quindi il tuo problema probabilmente risiede altrove.