2014-10-08 3 views
-2

У меня есть таблица в SQL, которая включает в себя различные службы. Каждая служба имеет некоторые качества (это означает, что каждая строка имеет разные столбцы в SQL). Например:NullReferenceException при попытке создать список массива класса

s1: id1, a1, b1 (ID: INT, а: SMALLINT, б: реальная)

s2: id2, a2, b2

...

I хотите иметь список этих служб в C#.

По некоторым причинам каждый столбец должен иметь некоторые атрибуты. Например:

Для a1 формы s1, мы должны иметь эти:

a1.type, a1.typical, a1.min

Это то, что я сделал:

public class ClsAdvertisement 
{ 
public string type { get; set; } 
public double typical { get; set; } 
public double min { get; set; } 
} 

protected void MyFuction() 
{ 
     List<ClsAdvertisement[]> services = new List<ClsAdvertisement[]>(); 
     SqlDataReader dr1 = cmd1.ExecuteReader(); 
     if (dr1.HasRows) 
     { 
     while (dr1.Read()) 
     { 
      ClsAdvertisement[] qualities=new ClsAdvertisement[3]; 

      if (dr1.IsDBNull(dr1.GetOrdinal("id")) == false) 
      { 
       qualities[0].typical = double.Parse(dr1["id"].ToString()); 
       qualities[0].type = "id"; 
       qualities[0].min = qualities[0].typical; 
      } 
      if (dr1.IsDBNull(dr1.GetOrdinal("a")) == false) 
      { 
       qualities[1].typical = double.Parse(dr1["a"].ToString()); 
       qualities[1].type = "a"; 
       qualities[1].min = qualities[1].typical - 1.0; 
      } 
      if (dr1.IsDBNull(dr1.GetOrdinal("b")) == false) 
      { 
       qualities[2].typical = double.Parse(dr1["b"].ToString()); 
       qualities[2].type = "b"; 
       qualities[2].min = qualities[2].typical - 1.0; 
      } 

      services.Add(new ClsAdvertisement[] { qualities[0], qualities[1], qualities[2] }); 
     } 
    } 
    if (dr1.IsClosed == false) dr1.Close(); 
} 

ли это хороший способ сделать это?

Если да, то я получаю ошибку

System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта

В строке:

qualities[0].typical = double.Parse(dr1["id"].ToString()); 

С моей поисков, я знал, что причина в том, что ClsAdvertisement [] не существует, чтобы установить типичный для. Но я не знаю, как это инициализировать?

Пожалуйста, помогите мне. Большое спасибо.


Обратите внимание, что я прочитал эту ссылку: "What is a NullReferenceException, and how do I fix it?". Я не могу получить ответ по этой ссылке. Я хочу знать, хорош ли мой способ или нет, и если да, то как его инициализировать, что не упоминается в этой ссылке.

+0

Мгновентировать объекты в вашем массиве. –

+0

Посмотрите: [Что такое исключение NullReferenceException и как его исправить?] (Http: // stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) –

+0

Я читал это раньше. Он сказал, что я должен инициализировать это и проверить, является ли оно нулевым или нет. Но он не работает для меня. Это не null. id имеет что-то в этом, я должен инициализировать это. Но я не знаю, как это сделать. И еще один вопрос в том, что мой путь - хороший способ для того, что я делаю? Огромное спасибо –

ответ

0

Мгновентиляция объектов также может быть выполнена при создании массива. Обратите внимание, что сам массив качеств можно добавить в список служб. Третья оптимизация - использование DataReader.

 List<ClsAdvertisement[]> services = new List<ClsAdvertisement[]>(); 
     using (IDataReader dr1 = cmd1.ExecuteReader()) 
     { 
      while (dr1.Read()) 
      { 
       ClsAdvertisement[] qualities = { new ClsAdvertisement(), new ClsAdvertisement(), new ClsAdvertisement() }; 

       if (!dr1.IsDBNull(dr1.GetOrdinal("id"))) 
       { 
        qualities[0].typical = double.Parse(dr1["id"].ToString()); 
        qualities[0].type = "id"; 
        qualities[0].min = qualities[0].typical; 
       } 
       if (!dr1.IsDBNull(dr1.GetOrdinal("a"))) 
       { 
        qualities[1].typical = double.Parse(dr1["a"].ToString()); 
        qualities[1].type = "a"; 
        qualities[1].min = qualities[1].typical - 1.0; 
       } 
       if (!dr1.IsDBNull(dr1.GetOrdinal("b"))) 
       { 
        qualities[2].typical = double.Parse(dr1["b"].ToString()); 
        qualities[2].type = "b"; 
        qualities[2].min = qualities[2].typical - 1.0; 
       } 

       services.Add(qualities); 
      } 
     } 
+0

Большое спасибо. Это правильно, и это лучший. –

0

qualities[0] есть null.

Первая строка должна исправить:

qualities[0] = new ClsAdvertisement(); 
qualities[0].typical = double.Parse(dr1["id"].ToString()); 
qualities[0].type = "id"; 
qualities[0].min = qualities[0].typical; 

Аналогично для всех остальных элементов массива.

+0

Большое спасибо. Это верно. –

0

Проблема, скорее всего, заключается в том, что вы не создаете экземпляр объекта, о котором идет речь, перед заполнением его свойств. Попробуйте сделать это так:

if (dr1.IsDBNull(dr1.GetOrdinal("id")) == false) 
    { 
     qualities[0] = new ClsAdvertisement(); 
     qualities[0].typical = double.Parse(dr1["id"].ToString()); 
     qualities[0].type = "id"; 
     qualities[0].min = qualities[0].typical; 
    } 
+0

Большое спасибо. Это верно. –

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