2015-11-20 2 views
0

У меня есть проблема, я выполнить динамичную T-SQL запроса, который возвращает сводную таблицу, как:добавить свойства к классу во время выполнения в C#

code  description Price col1 col2 col3 col4 col5 ............. column n 

acx  cable1   123 2  0  0  0  1 

bbb  vitro   35  0  1  0  58  0 

и я думаю, чтобы создать класс, как это :

public class excelInventory 
     { 
      public string code { get; set; } 
      public string description { get; set; } 
      public decimal col1 { get; set; } 
      public decimal col2 { get; set; } 
      public decimal col3 { get; set; } 
      public decimal col4 { get; set; } 
      public decimal col5 { get; set; } 
     } 

тогда я прочитал из результата запроса с DataReader и INSER в Список excelInventory:

SqlDataReader oDataReader = oCommand.ExecuteReader(); 
      List<excelInventory> excelin = new List<excelInventory>(); 
    while (oDataReader.Read()) 
       { 
        excelInventory inv = new excelInventory(); 
        inv.code = oDataReader.GetValue(0).ToString(); 
        inv.description = oDataReader.GetValue(1).ToString(); 
        if (string.IsNullOrEmpty(oDataReader.GetValue(2).ToString())) { inv.stock = 0; } 
        else { inv.stock = decimal.Parse(oDataReader.GetValue(2).ToString()); } 
        if (string.IsNullOrEmpty(oDataReader.GetValue(3).ToString())) { inv.precio = 0; } 
        else { inv.precio = decimal.Parse(oDataReader.GetValue(3).ToString()); } 
        if (string.IsNullOrEmpty(oDataReader.GetValue(4).ToString())) { inv.col1 = 0; } 
        else { inv.col1 = decimal.Parse(oDataReader.GetValue(4).ToString()); } 
        if (string.IsNullOrEmpty(oDataReader.GetValue(5).ToString())) { inv.col2 = 0; } 
        else { inv.col2 = decimal.Parse(oDataReader.GetValue(5).ToString()); } 
        if (string.IsNullOrEmpty(oDataReader.GetValue(6).ToString())) { inv.col3 = 0; } 
        else { inv.col3 = decimal.Parse(oDataReader.GetValue(6).ToString()); } 
        if (string.IsNullOrEmpty(oDataReader.GetValue(7).ToString())) { inv.col4 = 0; } 
        else { inv.col4 = decimal.Parse(oDataReader.GetValue(7).ToString()); } 
        if (string.IsNullOrEmpty(oDataReader.GetValue(8).ToString())) { inv.col5 = 0; } 
        else { inv.col5 = decimal.Parse(oDataReader.GetValue(8).ToString()); 

excelin.Add(inv);//Add the object to a list 

} 

, но проблема заключается в том, что количество столбцов, возвращаемых не всегда одинаково, поэтому мне нужно изменить программный код, чтобы изменить количество свойств класса, возможно, в следующий раз, когда я запустим sql-запрос, возвратит 10 столбцов, так что это не действительный.

Я не знаю, могу ли я добавить свойства excelInventory во время выполнения, поэтому я думаю использовать двумерный массив, я могу объявить массив после datareader и использовать dataReader.FieldCount, чтобы узнать количество столбцов ,

Но как я объявляю массив и как я перенаправляю массив при чтении данных в соответствии с количеством строк?

+0

Что такое "mofiy"? – DavidG

+0

Можете ли вы предоставить код 'dataReader'? – Grundy

+0

изменил название, я хочу знать, можно ли добавлять свойства к классу во время выполнения, и если это не так, как я могу использовать двумерный массив. – Ion

ответ

1

Да, вы можете использовать массивы и найти размер массива, который вы можете использовать, сколько нет строк в datatable и сколько столбцов присутствует. Тем не менее, я бы предпочел использовать List<decimal>, поэтому мне не нужно беспокоиться об отсутствии столбцов, возвращаемых datatable. Код с этим решением будет выглядеть примерно так:

public class excelInventory 
     { 
      public excelInventory(){ 
       cols = new List<decimal>(); 
      } 
      public string code { get; set; } 
      public string description { get; set; } 
      public List<decimal> cols{get;set;} 
     } 

Сначала вам нужно инициализировать список. вы можете сделать это в конструкторе, как я сделал в модифицированном коде после вашего комментария. затем, когда вы присваиваете значения cols, то вам нужно следить за синтаксисом

cols.Add(dr.getValue(2)); //you can access this element later by cols[0] 
cols.Add(dr.getValue(3)); //you can access this element later by cols[1] 
+0

Мне нравится это решение, отлично звучит, но когда я хочу добавить данные differents в cols, как я это делаю, что-то вроде cols [0] = dr.getvalue (2) ???? – Ion

+0

отредактировал ответ –

+0

GREAT, THANKS !! – Ion

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