Как использовать try, catch в System.NullReferenceException (ссылка на объект не установлена ​​для экземпляра объекта) - PullRequest
0 голосов
/ 13 декабря 2011

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

var ien_content = from c in this.DataContext.tbl_Contents
              where c.ContentTypeID == id
              &&
              (
              IsActive == false?true :(c.Active == null?true:c.Active > 0)
              )
              orderby c.RegisterDate descending 
              select c;
return ien_content.ToList();

Есть много строк в этом tbl_Contents, но когда все эти строки установлены Active = 0, он показывает ошибку: System.NullReferenceException: ссылка на объект не установлена ​​на экземпляробъекта.

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

Ответы [ 3 ]

0 голосов
/ 13 декабря 2011

Уточните запрос с помощью проверки на ноль для c, используя , где c! = Null условие. Следовательно, вы можете переписать это так:

if(DataContext != null && DataContext.tbl_Contents != null)
{
    var ien_content = from c in this.DataContext.tbl_Contents
          where c!= null && c.ContentTypeID == id
          &&
          (
          IsActive == false?true :(c.Active == null?true:c.Active > 0)
          )
          orderby c.RegisterDate descending 
          select c;
}

Если все еще есть исключение, то остается только c.RegisterDate, который может быть нулевым. Поэтому проверьте, не является ли c.Registerdate нулевым для какой-либо из ваших строк.

Попробуйте заменить linq на forloop, чтобы вы могли отлаживать его построчно, что-то вроде этого

List list = new List();
foreach(var c in this.DataContext.tbl_Contents)
{
if(c.ContentTypeID == id && ( IsActive == false?true :(c.Active == null?true:c.Active > 0)))
    list.Add(c)
}
0 голосов
/ 13 декабря 2011

Сначала попробуйте проверить его без строки isActive:

              var ien_content = from c in this.DataContext.tbl_Contents
              where c.ContentTypeID == id
              orderby c.RegisterDate descending 
              select c;

              if(ien_content.Count() > 0 )
              {
                //records exist
               } 
              else {//no records}

Если с этим нет проблем:

              var ien_content = from c in this.DataContext.tbl_Contents
              where c.ContentTypeID == id
              &&  (IsActive == false?true :(c.Active == null?true:Convert.ToInt32(c.Active) > 0))
              orderby c.RegisterDate descending 
              select c;

              if(ien_content.Count() > 0 )
              {
                return ien_content.ToList();
               } 
              else {//no records}

Или вы можете просто отделить IsActive от вашего метода linq.

      if(IsActive==true)
       {
 var ien_content = from c in this.DataContext.tbl_Contents
                  where c.ContentTypeID == id
                  && c.Active == null
                  orderby c.RegisterDate descending 
                  select c;

                  if(ien_content.Count() > 0 )
                  {
                     return ien_content.ToList();
                   } 
                  else {//no records}
       }
       else
       {
             var ien_content = from c in this.DataContext.tbl_Contents
              where c.ContentTypeID == id
              && Convert.ToInt32(c.Active) > 0
              orderby c.RegisterDate descending 
              select c;

              if(ien_content.Count() > 0 )
              {
                return ien_content.ToList();
               } 
              else {//no records}
        }

С уважением

0 голосов
/ 13 декабря 2011

Исходя из предоставленной вами ограниченной информации, я предполагаю, что c само по себе равно нулю.Вы уверены, что в tbl_Contents нет строк null?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...