2013-03-08 3 views
1

Я запускаю код, который создает данные. Из этого datatable, я gleen государство & CRID. Я использую эти данные для запуска кода для получения PRID. Проблема в том, что каждый раз, когда я запускаю это, я получаю Null Reference Exception. Я попытался объявить int PRID = 0 перед запуском кода; однако в итоге я получаю 0 в качестве ответа каждый раз. Я выполнил код в SQLServer 2008, используя те же параметры, и получаю правильный результат.
Мне не удалось найти причину, по которой этот код не работает.Получение нулевой ссылки исключение вызов хранимой процедуры

public int GetPRID(int RRID, string State, int PCID) 
    { 
     try 
     { 

      SQLCON = new SqlConnection(connectionString); 
      SQLCON.Open(); 
      SQLCmd = new SqlCommand("spGetPRID", SQLCON); 
      SQLCmd.CommandType = CommandType.StoredProcedure; 
      SQLCmd.Parameters.Add("@RRID", SqlDbType.Int).Value = RRID; 
      SQLCmd.Parameters.Add("@State", SqlDbType.VarChar).Value = State; 
      SQLCmd.Parameters.Add("@PCID", SqlDbType.Int).Value = PCID; 

      int PRID = (Int32)SQLCmd.ExecuteScalar(); 
      return PRID; 
     } 
     catch(Exception ex) 
     { 
      HttpContext.Current.Response.Redirect("~/ErrorRedirect.aspx?" + ex.Message, false); 
      return 0; 
     } 
     finally 
     { 
      SQLCON.Close(); 
     } 
    } 
+3

На какой линии вы получаете исключение? Это должно дать вам (и нам) ключ. – JustAnotherUserYouMayKnow

+0

Какая строка генерирует исключение? – yoozer8

+0

int PRID = (Int32) SQLCmd.ExecuteScalar(); –

ответ

0

Я нашел проблему. Это не было в моем коде на C# - это было в самом SQL. Я объявлял @PRID как int и просил его возвращать @PRID.

Как только я удалил это, он работал нормально. Спасибо всем за ваш вклад.

2

Эта линия является проблематичной здесь

int PRID = (Int32)SQLCmd.ExecuteScalar(); 

, конечно, я не могу знать результат хранимой процедуры, но ExecuteScalar может возвращать NULL, и если это так, чтобы бросок Int32 потерпит неудачу с ошибкой null reference exception

MSDN says

Ретур нс первый столбец первой строки в наборе результатов, или нулевое ссылка (Nothing в Visual Basic), если набор результатов пуст

Так правильный подход, если есть возможность получить нуль как возвращаемое значение

object result = SQLCmd.ExecuteScalar(); 
    if(result != null) 
     PRID = Convert.ToInt32(result);   
1

Из памяти SQLCmd.ExecuteScalar() будет возвращать нулевое значение, если не возвращается никакого значения, что даст вам нулевой ссылочный исключение. Если значение возвращается, но значение является нулевым значением базы данных, оно возвращает BDNull.value, которое также потерпит неудачу, потому что оно не может быть передано в int32.

+0

, когда я выполняю из SQL, результат равен 2. –

+0

Используйте профилировщик SQL, чтобы узнать, какой запрос является результатом вашего кода, он может отличаться от того, что вы используете для проверки, например параметр может быть другим. Вызов ExecuteScaler явно возвращает null. –

+0

Спасибо, Бен. Ваш первый комментарий привел меня обратно к самому SQL-коду, который помог мне найти проблему. –

Смежные вопросы