2015-04-22 2 views
-1

У меня есть цикл while внутри соединения с базой данных, где я хочу создать объект из значений, полученных из базы данных. Это код, который я использовал:Создайте новый объект в каждом цикле

public void dbConnect() 
    { 
     using (SqlConnection myConnection = new SqlConnection("server=CHAYU\\SQLEXPRESS;" + 
            "Trusted_Connection=yes;" + 
            "database=restaurantApp; " + 
            "connection timeout=30")) 
     { 

      string oString = "Select * from Meal where availability=1"; 
      SqlCommand oCmd = new SqlCommand(oString, myConnection); 
      myConnection.Open(); 
      using (SqlDataReader oReader = oCmd.ExecuteReader()) 
      { 
       while (oReader.Read()) 
       { 
        Meal m = new Meal(); 
        m.mealID = Convert.ToInt32(oReader["mealId"]); 
        m.mealName = oReader["mealName"].ToString(); 
        m.quantity=Convert.ToInt32(oReader["quantity"]); 
        m.timeToProduce = Convert.ToInt32(oReader["timeToProduce"]); 
        m.availability = true; 


       } 

       myConnection.Close(); 
      } 
     } 
    } 

Я хочу назвать этот код каждый раз, когда форма нагрузок, так что объекты создаются в самом начале, и впоследствии они могут манипулировать. Но, моя проблема заключается в том, как мне это сделать, имея другую ссылочную переменную для объекта внутри цикла while?

+2

Ваш вопрос не ясно ... но это звучит, как вы должны быть создание коллекции ... –

+1

Не используйте select * PLS, выберите только то, что вам нужно. – EaziLuizi

+0

@Praveen Определенно не ArrayList! – dcastro

ответ

4

Хотите ли вы каждый раз поесть? Создайте список и сохраните свои предметы для еды во время итерации!

List<Meal> mList = new List<Meal>(); 
while (oReader.Read()) 
{ 
    Meal m = new Meal(); 
    m.mealID = Convert.ToInt32(oReader["mealId"]); 
    m.mealName = oReader["mealName"].ToString(); 
    m.quantity = Convert.ToInt32(oReader["quantity"]); 
    m.timeToProduce = Convert.ToInt32(oReader["timeToProduce"]); 
    m.availability = true; 
    mList.Add(m); 
} 
+0

Если я хочу отредактировать значения атрибута объекта, могу ли я сделать это после того, как он находится в списке? – CDamsinghe

+0

да, доступ к нему по индексу 'mList [0] .mealName =" Fish ";' или Linq 'mList.Where (x => x.mealID == 10) .First(). FoodName =" Chips "; ' – fubo

0

Добавить каждый созданный объект в цикле в список. По умолчанию каждое Meal, созданное в вашем цикле, является другой ссылкой, но вы не храните их в любом месте, чтобы манипулировать позже.

0

Используйте этот метод расширения Получить список объектов в классе datareder

public static List<T> DataReaderMapToList<T>(IDataReader dr) 
{ 
    List<T> list = new List<T>(); 
    T obj = default(T); 
    while (dr.Read()) { 
     obj = Activator.CreateInstance<T>(); 
     foreach (PropertyInfo prop in obj.GetType().GetProperties()) { 
      if (!object.Equals(dr[prop.Name], DBNull.Value)) { 
       prop.SetValue(obj, dr[prop.Name], null); 
      } 
     } 
     list.Add(obj); 
    } 
    return list; 
} 

Затем используйте его как этот

List<Meal> MealList = new List<Meal>(); 
MealList = DataReaderMapToList<Meal>(reader); 
Смежные вопросы