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.