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.

Другие вопросы по тегам