2013-04-04 32 views
-2

我想在MVC中使用下面的代碼,並在此創建了IEnumerable是我做了什麼至今:無法在一類

public class MoviesModel 
{ 
    public int Id { get; set; } 
    public string MovieName { get; set; } 
    public string Actor { get; set; } 
    public int Year { get; set; } 
} 

控制器

public MoviesModel Index() 
    { 
     MoviesModel myModel; 
     string connectionString = 
      ""; 
     SqlConnection con = new SqlConnection(connectionString); 
     SqlCommand com = con.CreateCommand(); 

     com.CommandText = "SELECT [ID] ,[MovieName] ,[Actor] ,[Year] FROM [dbo].[Movies]"; 
     con.Open(); 
     using (SqlDataReader reader = com.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       myModel = new MoviesModel 
       { 
        myModel.Id = Convert.ToInt32(reader[0]), 
        myModel.MovieName = reader[1].ToString(), 
        myModel.Actor = reader[2].ToString(), 
        myModel.Year = Convert.ToInt32(reader[3]) 
       }; 
      } 
     } 

     con.Close(); 
     return myModel; 
    } 

但我得到以下錯誤

cannot initialize class with a collection because it does not implement System.Collection.IEnumerable 
+4

您正在更新循環中myModel的值。它只會得到最後一行的值。你也沒有調用存儲過程。 – 2013-04-04 19:38:37

+0

另外,你沒有關閉你的數據庫連接。 [使用語句](http://msdn.microsoft.com/en-us/library/yh598w02.aspx):使用它們! – 2013-04-04 19:41:10

+0

當我構建我的解決方案時,我收到此錯誤。 @Joel是啊!我需要這樣做..我正在編寫代碼,我一看到錯誤就卡住了。我無法弄清楚。 – Zerotoinfinity 2013-04-04 19:42:34

回答

1

你得到的編譯錯誤帶有一個文件名和行號,我保證那些東西並不指向你所引用的任何代碼。

實際上,我把它放回去了。我認爲這可能是編譯錯誤的根源(告訴我們編譯器抱怨的內容會有什麼幫助)。

myModel = new MoviesModel 
{ 
    myModel.Id = Convert.ToInt32(reader[0]), 
    myModel.MovieName = reader[1].ToString(), 
    myModel.Actor = reader[2].ToString(), 
    myModel.Year = Convert.ToInt32(reader[3]) 
}; 

這不是正確的語法。在花括號裏面是爲了初始化myModel而運行的代碼 - 你不能在括號內引用myModel,因爲它在括號內的代碼完成執行之後才存在。幸運的是,你並不需要,因爲這是用於設置這些屬性的語法:更廣泛地說

myModel = new MoviesModel 
{ 
    Id = Convert.ToInt32(reader[0]), 
    MovieName = reader[1].ToString(), 
    Actor = reader[2].ToString(), 
    Year = Convert.ToInt32(reader[3]) 
}; 

,我會去上肢體和猜測,你真正想要做的是返回一個集合的MoviesModel對象,而不是恰好是結果集中最後一部影片的單個MoviesModel對象。代碼來執行這將是這個樣子:

public ActionResult Index() 
{ 
    var models = new List<MoviesModel>(); 
    string connectionString = ""; 
    using (var con = new SqlConnection(connectionString)) 
    using (var com = con.CreateCommand()) 
    { 
     com.CommandText = "SELECT [ID] ,[MovieName] ,[Actor] ,[Year] FROM [dbo].[Movies]"; 
     con.Open(); 
     using (var reader = com.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       var myModel = new MoviesModel 
       { 
        Id = reader.GetInt32(0), 
        MovieName = reader.GetString(1), 
        Actor = reader.GetString(2), 
        Year = reader.GetInt32(3) 
       }; 

       models.Add(myModel); 
      } 
     } 
    } 

    return View(models); 
} 

順便說一句,Convert.ToInt32是一個非常低效的方式來得到的東西,是已經在數據庫中的一個整數,並在閱讀器。 GetInt32方法將表現更好。

+0

感謝您指出我的錯誤..我明白我的問題有點愚蠢:) 這真是一個很好的答案與解釋 – Zerotoinfinity 2013-04-04 20:17:53