ExecuteScalar генерирует исключение NullReferenceException при вызове хранимого процесса, который возвращает 1
Я провел некоторое исследование, прежде чем опубликовать этот вопрос, и я осознаю тот факт, что когда данные не возвращаются, ExecuteScalar генерирует исключение System.NullReferenceException. Вот почему я изменил свой хранимый процесс, чтобы "вернуть 1", так что есть гарантированное возвращаемое значение. Тем не менее, я все еще получаю исключение ссылки NULL.
Поэтому я попытался использовать SqlCommand для запроса таблицы, содержащей данные:
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM ATableThatHasValues", conn)
Когда я запустил execute scalar, я смог выбрать значение, чтобы знать, что у меня есть разрешение на запрос к базе данных. Я подозреваю, что это какая-то конкретная сохраненная настройка разрешения процесса, которую я пропустил?
Буду очень признателен за любые комментарии / предложения, так как я застрял на этом в течение дня.:(
Мой код выглядит так:
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
sqlConnection.Open();
using (SqlCommand sqlCommand = new SqlCommand("GetSomeValue", sqlConnection))
{
sqlCommand.CommandType = CommandType.StoredProcedure;
//sqlCommand.Parameters.Add(new SqlParameter("@Id", this.ID));
//sqlCommand.Parameters.Add(new SqlParameter("@State", 1 /* active */));
byte retValue = (byte)sqlCommand.ExecuteScalar();
return retValue;
}
}
СПАСИБО!
2 ответа
Случайное предположение
Вы используете RETURN, поэтому нет набора данных для чтения столбца 1, строки 1 для ExecuteScalar
Используйте параметры SELECT или OUTPUT
Изменить: На самом деле, не так случайно
RETURN 1
это не набор результатов: это "специальный" параметр
sqlCmd.Parameters.Add(New SqlParameter("RETURN_VALUE", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue
Я просто собираюсь пояснить, что сказал @gbn. Когда вы выполняете код SQL, вы можете возвращать информацию тремя различными способами, OUTPUT
параметры, табличные данные и / или один RETURN
значение. Как сказал @gbn, RETURN
значения по существу специализированы OUTPUT
параметры. ExecuteScalar
видит только информацию из табличных данных, а именно первый столбец первой строки. Если никакие табличные данные не получены, когда вы звоните ExecuteScalar
вместо этого возвращается нулевое значение. Если вы попытаетесь что-то сделать с этим нулевым значением, тогда, очевидно, вы получите NRE.