ExecuteScalar генерирует исключение NullReferenceException при вызове хранимого процесса, который возвращает 1 - PullRequest
0 голосов
/ 18 января 2011

Я провел некоторое исследование, прежде чем опубликовать этот вопрос, и я осознаю тот факт, что, когда данные не возвращаются, 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 ]

3 голосов
/ 18 января 2011

Я просто собираюсь пояснить, что сказал @gbn. Когда вы выполняете код SQL, вы можете возвращать информацию тремя различными способами: OUTPUT параметрами, табличными данными и / или одним RETURN значением. Как сказал @gbn, значения RETURN по существу являются специализированными OUTPUT параметрами. ExecuteScalar видит только информацию из табличных данных, а именно первый столбец первой строки. Если при вызове ExecuteScalar табличные данные не получены, вместо него возвращается нулевое значение. Если вы попытаетесь что-то сделать с этим нулевым значением, то, очевидно, вы получите NRE.

2 голосов
/ 18 января 2011

Случайная догадка

Вы используете RETURN, поэтому нет набора данных для чтения столбца 1, строки 1 для ExecuteScalar

Используйте параметры SELECT или OUTPUT

Редактировать: На самом деле, не так уж случайно

RETURN 1 не является набором результатов: это «специальный» параметр

sqlCmd.Parameters.Add(New SqlParameter("RETURN_VALUE", SqlDbType.Int)).Direction = ParameterDirection.ReturnValue
...