Кэширование
Кэширование нужно для увеличения эффективности работы с данными. При включенном кэшировании SqlDataSource "запоминает" большое количество записей на заданное время, даже если все данные не отображаются сразу, но могут понадобиться при перелистывании. Например, студент читает первую страницу лекции, логично, что он вскоре перейдет ко второй. Если сервер хранит в оперативной памяти все страницы лекции, он их оперативно выдаст, не обращаясь к базе.
При включенном кэшировании данные читаются "большим куском", а выборка записей происходит с помощью фильтрования.
В SqlDataSource кэширование и сортировка возможны только при получении данных через DataSet. Если DataSourceMode равно DataReader, а EnableCaching — True, будет выброшено исключение NonSupportedException.
Длительность кэширования можно задать в свойстве CacheDuration, это может быть определенное количество секунд или Infinite, то есть данные никогда не обновляются.
Поведение кэширования зависит от сочетания свойств CacheDuration и CacheExpirationPolicy. Если значение CacheExpiration Policy равно Absolute, то элемент запрашивает информацию через промежутки времени, определенные в CacheDuration, а старую стирает из памяти. Если CacheExpirationPolicy равен значению Sliding, то SqlDataSource начинает отсчет времени после каждого запроса к нему. Данные из кэша устаревают, если в течение времени CacheDuration не было ни одного Select-запроса.
В FilterExpression задается выражение для фильтрации, причем формат этих выражений аналогичен тому, что используется для форматирования строк с параметрами в фигурных скобках {0}, {1}, в которые подставляются значения из источника, указанного в Filter Parameters:
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT * FROM [Customers]" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>" EnableCaching="True" CacheExpirationPolicy="Sliding"> </asp:SqlDataSource>
У этого элемента включено кэширование, и он является источником данных для GridView.
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>" SelectCommand="SELECT * FROM [Customers]" ProviderName="<%$ ConnectionStrings:NorthwindConnectionString.ProviderName %>" FilterExpression="CustomerID=’{0}’ " <FilterParameters> <asp:ControlParameter Name="CustomerID" ControlId="GridView1" PropertyName="SelectedValue"></asp:ControlParameter> </FilterParameters> </asp:SqlDataSource>
А у этого включена фильтрация, и он является источником данных для DetailsView. Элемент управления DetailsView всегда отображает одну запись, при этом в данном случае это та запись, которая выбрана в контроле GridView1.