已经有一个打开的 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" 的调用,或者创建第二个数据库连接。我更喜欢这个解决方案:
首先,收集所有类别
其次,遍历所有类别并查询子类别并将它们附加到您的类别对象
我有在 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" 的调用,或者创建第二个数据库连接。我更喜欢这个解决方案:
首先,收集所有类别 其次,遍历所有类别并查询子类别并将它们附加到您的类别对象