Според документацията на MSDN за DbCommand.ExecuteScalar:
Ако първата колона от първия ред в набора от резултати не бъде намерена, се връща нулева препратка (Нищо във Visual Basic). Ако стойността в базата данни е нула, заявката връща DBNull.Value.
Помислете за следния фрагмент:
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();
}
По време на изпълнение (тествано под ODP.NET, но трябва да е същото при всеки доставчик на ADO.NET), той се държи по следния начин:
- Ако редът не съществува, резултатът от
command.ExecuteScalar()
е null, което след това се прехвърля към нулев низ и се присвоява наgetusername
. - Ако редът съществува, но има NULL в потребителското име (възможно ли е това дори във вашата DB?), резултатът от
command.ExecuteScalar()
еDBNull.Value
, което води доInvalidCastException
.
Във всеки случай, NullReferenceException
не би трябвало да е възможно, така че проблемът ви вероятно е другаде.