已经有一个打开的 DataReader 与此命令关联,必须先关闭它 - WCF

There is already an open DataReader associated with this Command which must be closed first - WCF

我有在 WCF 服务函数中调用的函数,我在 excute reader 行的 subcategoriesGenerator 函数中得到上述异常 在第二个函数中创建的 cmd 不是应该与另一个完全不同的实例吗 请问我很困惑,我需要帮助和建议吗?

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

当您打开 reader 时,您无法在您的连接中打开另一个 reader。您必须在第一个 while 语句之外提取函数 "subcategoriesGenerator" 的调用,或者创建第二个数据库连接。我更喜欢这个解决方案:

首先,收集所有类别 其次,遍历所有类别并查询子类别并将它们附加到您的类别对象