Вопрос

Я пишу приложение wpf destop и хотел бы использовать SQL Server CE в качестве серверной части.Я пытаюсь придумать хороший способ эффективной подкачки данных.В SQL Server Express я могу сделать что-то вроде этого:

Select ID, FirstName, LastName
From (SELECT  ROW_NUMBER() OVER (ORDER BY ID)
 AS Row, ID, FirstName, LastName
 From TestTable                             
) 
WHERE  Row > 1 AND Row <= 10    

Есть ли что-нибудь сопоставимое в SQL Server CE?Я не совсем уверен, что поддерживается, а что нет.Я хочу возвращать из базы данных только 10 строк одновременно, и мне не нужно извлекать все данные, а затем фильтровать их для отображения пользователю, поскольку это намного медленнее.Спасибо.

Это было полезно?

Решение

Честно говоря, наверное, самое быстрое, что нужно сделать, это использовать SqlCeDataReader и вызвать .Read () 10 раз. Затем, когда пользователь переходит на следующую страницу, вы уже указываете на 11-й результат и можете прочитать еще 10. Если вам нужно вернуться назад, вы можете либо кэшировать свои результаты, либо перейти на SqlCeResultSet , который поддерживает

Другие советы

В настоящее время я также работаю над приложением WPF, которое использует SQL Server CE в качестве механизма сохранения. У нас есть несколько (более 40) таблиц, и некоторые из них довольно большие (50 тыс. Записей, по крайней мере, для моих стандартов).

Мой совет относительно подкачки данных непосредственно в SQL CE таков: избегайте, если можете! Я использовал подход, описанный Бобом Кингом, и, по крайней мере, для меня он привел к Очень Уродливому коду, реальному кошмару обслуживания.

Если вам не понадобится пролистывать десятки тысяч записей, я считаю, что лучший способ - загрузить их все, используя SqlCeDataReader в коллекцию пользовательских классов, а затем пролистать коллекцию в памяти. Я обнаружил, что этот подход более отзывчив, чем повторное выполнение SQL-запроса каждый раз, даже с кэшированием. Случилось так, что в моем случае запросы были довольно сложными, и производительность SqlCeDataReader была достаточно хорошей, так что снижение производительности было практически незаметным. Не нужно указывать, что после первой пакетной загрузки каждое изменение страницы происходит практически мгновенно, поскольку все хранится в памяти.

Общее мнение моих пользователей состояло в том, что нормально дождаться появления первых результатов, если это впоследствии приведет к более быстрой подкачке страниц. А с помощью LINQ пейджинг так же прост, как и вызов методов Skip и Take. Я реализовал эту логику внутри Pager & Lt; T & Gt; класс, что делает его очень сухим и приятным.

Есть несколько способов, но наиболее упрощенным был бы следующий:

Предполагая

  1. Размер страницы = 10
  2. Страница = 2

Тогда

  1. Первый ТОП = Размер страницы (10)
  2. Второй ТОП = Размер страницы * Страница (20)

SELECT
 [Page].[ID],
 [Page].[FirstName],
 [Page].[LastName]
FROM
(
SELECT TOP (10)
 [FirstRows].[ID],
 [FirstRows].[FirstName],
 [FirstRows].[LastName]
FROM
 (
 SELECT TOP (20)
  [TestTable].[ID],
  [TestTable].[FirstName],
  [TestTable].[LastName]
 FROM
  [TestTable]
 ORDER BY
  [TestTable].[ID] ASC
 ) AS [FirstRows]
ORDER BY 
 [FirstRows].[ID] DESC
) AS [Page]
ORDER BY
  [Page].[ID] ASC

Я реализовал пользовательский пейджинг для сетки данных с использованием SQL CE. Я реализовал метод использования top в операторе select и пропуска записей, используя подзапрос, как обсуждалось в ответе выше. Но это хорошо работает с небольшим количеством данных. По мере того, как количество записей возрастает до тысячи, вышеуказанная методология становится менее полезной и снижает производительность.

Я решил проблему с низкой производительностью, используя свою собственную технику. Я сохранил идентификатор первой и последней записи на каждой странице в переменных.

dim firstRecord=dt.rows(0)("id")

и

dim lastRecord=dt.Rows(dt.rows.count-1)("id")

Я инициализирую эти переменные после привязки сетки для каждой страницы.

Если пользователь нажимает кнопку «Далее», я получаю самые верхние (размер страницы) записи из базы данных, превышающей lastRecord.  Если пользователь нажимает на предыдущую кнопку, я получаю верхние (PageSize) записи из базы данных меньше, чем firstRecord. Также я заказываю по Id desc в этом случае. И измените порядок данных, используя dataview для asc перед привязкой к сетке данных.

Это сделало мой пейджинг максимально эффективным. Хотя мне пришлось приложить дополнительные усилия для вставки и удаления записей дел. Но я смог справиться с этим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top