ExecuteScalar создает исключение NullReferenceException - PullRequest
4 голосов
/ 18 февраля 2009

Этот код выдает NullReferenceException при вызове ExecuteScalar:

selectedPassengerID = 0;

//SqlCommand command = GenericDataAccess.CreateCommand();


// 2nd test
string connectionString = "";
SqlConnection conn;

connectionString = ConfigurationManager.
    ConnectionStrings["ConnST-MHM"].ConnectionString;
conn = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand();
command.CommandType = CommandType.StoredProcedure ;
command.Connection = conn;
command.CommandText = "SearchForPassenger";

SqlParameter param;

param = command.CreateParameter();
param.ParameterName = "@name";
param.Value = pName; // Session[""];
param.DbType = DbType.String;
command.Parameters.Add(param);

param = command.CreateParameter();
param.ParameterName = "@flightDate";
param.Value = date; 
param.DbType = DbType.String;
command.Parameters.Add(param);

param = command.CreateParameter();
param.ParameterName = "@ticketNo";
param.Value = ticketNumber; 
param.DbType = DbType.Int32;
command.Parameters.Add(param);

int item;

command.Connection.Open();
item = (int)command.ExecuteScalar();

Ответы [ 2 ]

12 голосов
/ 18 февраля 2009

Я инкапсулировал большую часть своей логики SQL в DAL. Один из этих методов DAL извлекает скалярные Ints, используя следующую логику. Это может работать для вас:

  object temp = cmnd.ExecuteScalar();
  if ((temp == null) || (temp == DBNull.Value)) return -1;
  return (int)temp;

Я знаю, что вы ввели много кода выше, но я думаю, что это действительно суть вашей проблемы. Удачи!

6 голосов
/ 18 февраля 2009

ExecuteScalar возвращает ноль, если по запросу не было возвращено ни одной записи (например, когда ваша хранимая процедура SearchForPassenger не возвращает строк).

Итак, эта строка:

item = (int) command.ExecuteScalar();

Пытается привести null к int в этом случае. Это поднимет NullReferenceException.

Согласно ответу Марка , который только что появился, вам нужно проверить на null:

object o = command.ExecuteScalar();
item = o == null ? 0 : (int)o;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...