2013-05-27 5 views
0

Я получаю следующее сообщение об ошибке:Ссылка на объект не указывает на экземпляр объекта [C#]

Object reference not set to an instance of an object

Я не знаю, что является причиной этой ошибки и как ее решить, вот мой код:

while(dr.Read()) 
    { 
    string variant = dr.GetString(0); 
    int size = dr.GetInt32(1); 
    int quantity = dr.GetInt32(2); 

    DataRow x = dt.Rows 
        .Cast<DataRow>() 
        .Where(r => r["variant_name"].Equals(variant) && r["size"].Equals(size)) 
        .FirstOrDefault(); 
        x["quantity"] = quantity;    

     } 

Я получаю ошибку на этой линии ->x["quantity"] = quantity; Я задаюсь вопросом, почему это даст нулевое значение, потому что я проверил в моей базе данных, что он должен вернуться ровно один матч.

+2

Довольно прямо ... Ошибка очень описательная – Sayse

+2

'x' равно null, поэтому предложение' Where' не дает никаких результатов. – Lee

ответ

2

На последней строке х равно нуль, зафиксировать

if(x != null) 
    x["quantity"] = quantity; 

Это происходит, если ваше состояние (.гд) не дает спичку.
В этот момент FirstOrDefault вернуть По умолчанию часть
и это нуль для эталонного объекта, как explained in MSDN

The default value for reference and nullable types is null.

+0

Я проверяю свою базу данных и должен дать хотя бы одно совпадение. – Harvey

+0

Извините, сэр ... Я не знаю, что изменить в этой строке кода. Как вы думаете, что неправильно в этой строке '.Where '? – Harvey

+0

Нет, я думал о контрольной проблеме, но это не так. Вы уверены, что строка в поле базы данных «variant_name» написана в точном случае вашего условия теста (без пробелов или перевода строки). – Steve

3

FirstOrDefault возвращает нулевое значение, если элемент не найден, и вы пытаетесь получить доступ к этому объекту.

+0

Сэр. Я уже проверяю мою базу данных и должен дать хотя бы одно совпадение. – Harvey

+0

Попробуйте добавить точку останова непосредственно перед x ["quantity"] = количество; и проверьте значение x. Я уверен, что это null, когда вы получите эту ошибку. –

+0

Как добавить точку останова? – Harvey

0
while(dr.Read()) 
{ 
    string variant = dr.GetString(0); 
    int size = dr.GetInt32(1); 
    int quantity = dr.GetInt32(2); 

    DataRow x = dt.Rows 
       .Cast<DataRow>() 
       .Where(r => (r["variant_name"].ToString().Equals(variant) && Convert.ToInt32(r["size"]).Equals(size))) 
       .FirstOrDefault(); 

    if (x != null) 
    { 
     x["quantity"] = quantity; 
    }  
} 

Спасибо за ваш ответ, это очень помогло мне. Я немного изменил строку .Where, и теперь это работает для меня. Еще раз спасибо!

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