2016-10-07 37 views
0

複数の属性値を含むことができる2つのプロパティを持つStorePageという名前のモデルがあり、後でコントローラのメソッドで配列として宣言しましたデータ・リーダー、データベース/テーブルの列から値を取得して、これらの配列に入れて、フロントエンド・アプリケーションにアクセスできるようにします。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; 
    } 

Forループ内の行は私にエラーを与えている:

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

storepage.SPAttributeRefID = reader.GetInt32(11); 

はそれが可能誰かが私はこの問題を解決しようとすることができますか?私はおそらくキャストが不足しているか、値を取得して保存するためのより良い方法があるかもしれません。ページと属性値との関係は1対多である。私の場合、ページは複数の属性を持つことができます。これは楽器、スタイル、スコアリングです。ここで

は私が取得しようとしているものの例である:

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

あなたの最後の編集に基づいて答えを更新しました。これはこれを処理する1つの方法であり、結果の唯一の違いは最後の2つの列であることを前提としています。 – 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。あなたのコードをありがとう。それはよさそうだと私はそれを試してみるつもりです。私は1つの質問だけを持っている、2つの新しいメンバーを追加する前にヌルのチェックを追加できますか? –

+0

@erasmocarlos - はい、ヌル値を確認する必要があります。私はコードを更新しました。 – Igor

+0

イーゴル、あなたのコードはすぐに働きました。私は属性値にアクセスできます!そのような安堵。どうもありがとうございます。 –

7

エラーは自明です。プロパティSPAttributeRefIDint[]です:

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)); 

あなたのアップデート後:何をすべきことは結果GroupByに使用LINQの上、後に、私が与えた最初の提案を使用しています。 whileループ処理1レコードの各反復と、達成しようとしているのはレコード間です。もう1つの方法は、ORMを使用してエンティティにlinqを使用し、データベース自体にGroupByを行うことです。

+0

@erasmo carlos - 理解しづらいため、ループで何をしようとしているのか説明してください。あなたは同じ価値を3回欲しいですか?異なる列とそのうち3列を読みたいですか? –

+0

私はSPAttributeRefIDの3つの異なるインデックスに追加したいと考えています。 – Hank

+0

@kalamazoowho - Ya :)私もそうだと思います。アップデート –

関連する問題