Вы вообще не должны вручную перебирать DataReader.Это инструмент только вперед.Только Repeater или вашего цикла while может выполнять итерацию результатов.Я полагаю, что вашей непосредственной проблемой является то, что ваш цикл while исчерпывает DataReader до того, как Repeater рендерится.
Когда вы вызываете DataBind()
, вы указываете Repeater визуализировать его шаблон для каждого элемента в назначенной вами коллекции.как его DataSource
.Таким образом, любая фильтрация должна была произойти раньше.В идеале, вам, вероятно, следует добавить эту логику фильтрации в качестве предложения where
к вашему выражению SQL.
Можете ли вы быть более конкретным в отношении реальной проблемы, которую вы пытаетесь решить?В противном случае трудно дать вам точный совет.
Обновление:
Имейте в виду, что while(reader.Read())
не работает как обработчик событий или иным образом похож накак это может семантически звучать .Другими словами, вы не говорите программе что-то делать, когда читается DataReader, вы говорите ему немедленно начать чтение данных (не связанных с Repeater).
Вот что я вам предлагаюtry:
string sql = "Your current SQL here";
string connectionString = "Your connection string here";
// The using block ensures that the connection will be closed and freed up,
// even if an unhandled exception occurs inside the block.
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
da.Fill(dt);
AllBrandsRptr.DataSource = dt;
AllBrandsRptr.DataBind();
var cuisineTypes = from row in dt.AsEnumerable()
select row["CuisineType"];
string cuisines = string.Join(", ", cuisineTypes.Distinct());
var venueTypes = from row in dt.AsEnumerable()
select row["VenueTypeName"];
string venues = string.Join(", ", venueTypes.Distinct());
}
Используя DataTable вместо DataReader, вы можете перебирать данные столько раз, сколько необходимо.DataReader более производительный, , если - это все, что вам нужно для однократного чтения данных только для пересылки, но DataTable гораздо более мощный и полезен в этих ситуациях, выходящий за рамки возможностей DataReader.
Стоит отметить, что если вы заботитесь об этом проекте в долгосрочной перспективе и хотите сделать его обслуживаемым, вам следует в конечном итоге перенести часть этого кода доступа к данным на отдельный уровень.Вы должны стремиться к тому, чтобы в ваших файлах .aspx.cs никогда не было операторов SQL или кода прямого доступа к данным.
Тогда ваш код в Page_Load может быть строго типизирован и с ним легче работать:
List<Brand> brands = Brand.GetAllBrands();
AllBrandsRptr.DataSource = brands;
AllBrandsRptr.DataBind();
var cuisineTypes = from brand in brands
select brand.CuisineType;
string cuisines = string.join(", ", cuisineTypes.Distinct());
var venueTypes = from brand in brands
select brand.VenueType;
string venues = string.join(", ", venueTypes.Distinct());