2016-10-07 4 views
0

У меня есть модель с именем StorePage, которая имеет 2 свойства, которые могут содержать несколько значений атрибутов, я объявил их как массивы, чтобы позже использовать метод в контроллере, итерации через считыватель данных, получить значения из столбца базы данных/таблицы, помещая их в эти массивы и сделать их доступными для моего приложения на передней панели.C#: Невозможно неявно преобразовать тип 'int' в 'int []'

public class StorePage 
{ 
    public int ActionTypeID { get; set; } 
    public int ResultTypeID { get; set; } 
    public string ResultMessage { get; set; } 
    public int StorePageID { get; set; } 
    public int SPPreambleID { get; set; } 
    public string Title { get; set; } 
    public string SEOTitle { get; set; } 
    public int ParentStorePageID { get; set; } 
    public string Meta { get; set; } 
    public string Image { get; set; } 
    public string ImageLink { get; set; } 
    public string Blurb { get; set; } 
    public int RegionID { get; set; } 
    public string Footer { get; set; } 

    // these are the arrays 
    public int[] SPAttributeRefID { get; set; } 
    public int[] AttributeID { get; set; } 

} 

// Ниже приведен метод, который получает значения из базы данных.

public StorePage GetPage(int StorePageID, int SPPreambleID) 
    { 
     StorePage storepage = new StorePage(); 
     using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DEV_BI01_LVT"].ConnectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand("mn_StorePage_GetPage", con)) 
      { 
       cmd.Parameters.AddWithValue("@StorePageID", SqlDbType.Int).Value = StorePageID; 

       if (SPPreambleID != -1)      
       { 
        cmd.Parameters.AddWithValue("@SPPreambleID", SqlDbType.Int).Value = SPPreambleID; 
       } 
       cmd.CommandType = CommandType.StoredProcedure; 
        con.Open(); 
        SqlDataReader reader = cmd.ExecuteReader(); 
        while (reader.Read()) 
        { 
         storepage.StorePageID = reader.GetInt32(0); 
         storepage.Title = (reader.IsDBNull(1)) ? string.Empty : reader.GetString(1); 
         storepage.SEOTitle = (reader.IsDBNull(2)) ? string.Empty : reader.GetString(2); 
         storepage.ParentStorePageID = (reader.IsDBNull(3)) ? -1 : reader.GetInt32(3); 
         storepage.Meta = (reader.IsDBNull(4)) ? string.Empty : reader.GetString(4); 
         storepage.SPPreambleID = (reader.IsDBNull(5)) ? -1 : reader.GetInt32(5); 
         storepage.Image = (reader.IsDBNull(6)) ? string.Empty : reader.GetString(6); 
         storepage.ImageLink = (reader.IsDBNull(7)) ? string.Empty : reader.GetString(7); 
         storepage.Blurb = (reader.IsDBNull(8)) ? string.Empty : reader.GetString(8); 
         storepage.RegionID = (reader.IsDBNull(9)) ? -1 : reader.GetInt32(9); 
         storepage.Footer = (reader.IsDBNull(10)) ? string.Empty : reader.GetString(10); 

         for (int i = 0; i <= 3; i++) 
         { 
          storepage.SPAttributeRefID = reader.GetInt32(11); 
         } 

        } 
      } 
     } 
     return storepage; 
    } 

Линия внутри для цикла дает мне ошибку:

Cannot implicitly convert type 'int' to 'int[]'

storepage.SPAttributeRefID = reader.GetInt32(11); 

Можно ли кто-то может попытаться помочь мне решить эту проблему? Мне, вероятно, не хватает роли или, возможно, есть лучший способ получить и сохранить значения. Связь между страницей и значениями атрибутов от одного до многих. В моем случае страница может иметь несколько атрибутов, это инструменты, стили и скоринг.

Вот пример того, что я пытаюсь получить:

23 trumpet seo 7 meta 26 trumpet.jpg /store/trumpet.jpg blurb 3 footer 1 506 
23 trumpet seo 7 meta 26 trumpet.jpg /store/trumpet.jpg blurb 3 footer 2 183 
23 trumpet seo 7 meta 26 trumpet.jpg /store/trumpet.jpg blurb 3 footer 3 45 

Последний столбец является атрибуты. Вы можете видеть, что это 3 разных значения, относящихся к одной странице записи.

За вашу помощь, заблаговременно.

+1

Что вы хотите сделать?Вы хотите добавить int в массив или вы определили его неправильно, и он не должен быть массивом для начала и просто int? – Igor

+0

Я обновил свой ответ на основе вашего последнего изменения. Это один из способов справиться с этим, и он предполагает, что единственными отличиями в результатах являются те последние два столбца. – Igor

ответ

2

Вы могли бы сделать это таким образом. Это предполагает, что последние 2 столбца (12,13) ​​являются элементами, принадлежащими массивам. Обратите внимание, что теперь у вас есть список вместо массива, так как они легче растут там, где массив имеет фиксированный размер.

public class StorePage 
{ 
    public StorePage(){ 
     SPAttributeRefID = new List<int>(); 
     AttributeID = new List<int>(); 
    } 
    // these are now Lists 
    public List<int> SPAttributeRefID { get; set; } 
    public List<int> AttributeID { get; set; } 

} 

public StorePage GetPage(int StorePageID, int SPPreambleID) 
{ 
    StorePage storepage = null; 
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DEV_BI01_LVT"].ConnectionString)) 
    using (SqlCommand cmd = new SqlCommand("mn_StorePage_GetPage", con)) 
    { 
     cmd.Parameters.AddWithValue("@StorePageID", SqlDbType.Int).Value = StorePageID; 

     if (SPPreambleID != -1)      
     { 
      cmd.Parameters.AddWithValue("@SPPreambleID", SqlDbType.Int).Value = SPPreambleID; 
     } 
     cmd.CommandType = CommandType.StoredProcedure; 
     con.Open(); 

     using(SqlDataReader reader = cmd.ExecuteReader()) 
     while (reader.Read()) 
     { 
      // create a new instance if not created yet 
      if(storepage == null) 
      { 
       storepage = new StorePage(); 
       storepage.StorePageID = reader.GetInt32(0); 
       storepage.Title = (reader.IsDBNull(1)) ? string.Empty : reader.GetString(1); 
       storepage.SEOTitle = (reader.IsDBNull(2)) ? string.Empty : reader.GetString(2); 
       storepage.ParentStorePageID = (reader.IsDBNull(3)) ? -1 : reader.GetInt32(3); 
       storepage.Meta = (reader.IsDBNull(4)) ? string.Empty : reader.GetString(4); 
       storepage.SPPreambleID = (reader.IsDBNull(5)) ? -1 : reader.GetInt32(5); 
       storepage.Image = (reader.IsDBNull(6)) ? string.Empty : reader.GetString(6); 
       storepage.ImageLink = (reader.IsDBNull(7)) ? string.Empty : reader.GetString(7); 
       storepage.Blurb = (reader.IsDBNull(8)) ? string.Empty : reader.GetString(8); 
       storepage.RegionID = (reader.IsDBNull(9)) ? -1 : reader.GetInt32(9); 
       storepage.Footer = (reader.IsDBNull(10)) ? string.Empty : reader.GetString(10); 
      } 
      // only read the columns 12,13 and add each respective member to the corresponding list 
      if(!reader.IsDBNull(11)) 
       storepage.SPAttributeRefID.Add(reader.GetInt32(11)); 
      if(!reader.IsDBNull(12)) 
       storepage.AttributeID.Add(reader.GetInt32(12)); 
     } 
    } 
    return storepage; 
} 
+0

Hi Igor. Спасибо за ваш код. Он выглядит хорошо, и я собираюсь попробовать его. У меня есть только один вопрос, может ли быть добавлен чек для null, прежде чем добавлять 2 новых члена? –

+0

@erasmocarlos - Да, если его столбец «nullable», то вам абсолютно необходимо проверить нулевое значение. Я обновил код. – Igor

+0

Игорь, о человек, ваш код работал сразу. Я могу получить доступ к значениям атрибутов! Такое облегчение. Огромное спасибо. –

7

Ошибка не требует пояснений. Свойство SPAttributeRefID является int[]:

public int[] SPAttributeRefID { get; set; } 

Результат reader.GetInt32(11); является int.

Если вы хотите, чтобы заполнить этот массив со значением затем:

storepage.SPAttributeRefID = new int[] { reader.GetInt32(11) }; 

К этому коду:

for (int i = 0; i <= 3; i++) 
{ 
    storepage.SPAttributeRefID = reader.GetInt32(11); 
} 

Я думаю, что вы хотите, чтобы заполнить массив с 3-х элементов из разных колонны. Вы можете сделать:

storepage.SPAttributeRefID = new int[] 
{ 
    reader.GetInt32(11), 
    reader.GetInt32(12), 
    reader.GetInt32(13) 
}; 

//Or: 
storepage.SPAttributeRefID = Enumerable.Range(11,3) 
             .Select(x => reader.GetInt32(x)); 

После вашего обновления: То, что вы должны сделать, это использовать первое предложение, которое я дал, а потом на использование Linq к GroupBy результатов. Каждая итерация цикла while обрабатывает 1 запись и то, что вы пытаетесь достичь, находится между записями. Другой вариант - использовать linq для сущностей через некоторый ORM и сделать это GroupBy в самой базе данных.

+0

@erasmo carlos - также объясните, что вы пытаетесь сделать с циклом, потому что это трудно понять. Вы хотите иметь такое же значение 3 раза? Вы хотите читать разные столбцы и 3 из них? –

+0

Я думаю, он хочет добавить его к 3 различным показателям SPAttributeRefID. – Hank

+0

@kalamazoowho - Я :) Я тоже так думаю. См. Обновление –

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