2015-02-04 2 views
0

У меня есть функции, вызываемые в функции сервиса WCF, и я получаю исключение, указанное выше в подкатегориях. Функция генератора на линии считывателя excute isn 't он предположил, что cmd, созданный во второй функции, совершенно другой экземпляр, чем другой, , пожалуйста, я смущен, и мне нужны советы для поддержки?Существует уже открытый DataReader, связанный с этой Командой, который должен быть закрыт первым - WCF

public static List<Category> categoryGenerator(ref SqlConnection con) 
    { 
     Category category = null; 
     List<Category> list = null; 
     List<SubCategory> subcategoryList = null; 
     string categoryName = null; 
     string categoryLink = null; 
     SqlCommand cmd = new SqlCommand("sp_categoriesgenerator", con); 
     SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

     while(reader.Read()) 
     { 
      categoryName = reader["CategoryName"].ToString(); 
      categoryLink = reader["CategorySEO"].ToString() + "/"; 
      subcategoryList = subcategoriesGenerator(ref con, Convert.ToInt32(reader["CategoryId"].ToString())); 

      category.categoryName = categoryName; 
      category.categoryLink = categoryLink; 
      category.subcategories = subcategoryList; 

      list.Add(category); 

      category = null; 
     } 
     reader.Close(); 
     return list; 
    }//end CategoryGenerator 

    public static List<SubCategory> subcategoriesGenerator(ref SqlConnection con, int categoryId) 
    { 
     SubCategory subcategory = null; 
     List<SubCategory> list = null; 
     string SubCategoryName = null; 
     string SubCategoryLink = null; 
     SqlCommand cmd = new SqlCommand("sp_subcategoriesgenerator", con); 
     cmd.Parameters.AddWithValue("@categoryID", categoryId); 
     SqlDataReader reader = cmd.ExecuteReader(); 

     while(reader.Read()) 
     { 
      SubCategoryName = reader["SubcategoryName"].ToString(); 
      SubCategoryLink = reader["CategorySEO"].ToString() + "/" + reader["SubcategorySEO"] + "/"; 
      subcategory.subcategoryName = SubCategoryName; 
      subcategory.subcategoryLink = SubCategoryLink; 
      list.Add(subcategory); 
      subcategory = null; 
     } 
     reader.Close(); 

     return list; 
    }// end subcategoriesGenerator 

ответ

1

Вы не можете открыть другого читателя в своем соединении, пока у вас есть открытый читатель. Вам нужно извлечь вызов функции «subcategoriesGenerator» вне вашего первого while-statement или создать второе соединение с базой данных. Я предпочитаю это решение:

Во-первых, собрать все категории Во-вторых, цикл по всем категориям и запрашивать подкатегорий и добавлять их в свой категории-объект