Подкачка данных в SQL Server CE (Compact Edition)
-
06-07-2019 - |
Вопрос
Я пишу приложение 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 , который поддерживает
Другие советы
В случае, если кто-то заходит на эту страницу в поисках ответа ... Я сталкивался с этим сообщением: Поддержка Пейджинговых запросов в SQL Server CE 4.0
В настоящее время я также работаю над приложением WPF, которое использует SQL Server CE в качестве механизма сохранения. У нас есть несколько (более 40) таблиц, и некоторые из них довольно большие (50 тыс. Записей, по крайней мере, для моих стандартов).
Мой совет относительно подкачки данных непосредственно в SQL CE таков: избегайте, если можете! Я использовал подход, описанный Бобом Кингом, и, по крайней мере, для меня он привел к Очень Уродливому коду, реальному кошмару обслуживания.
Если вам не понадобится пролистывать десятки тысяч записей, я считаю, что лучший способ - загрузить их все, используя SqlCeDataReader в коллекцию пользовательских классов, а затем пролистать коллекцию в памяти. Я обнаружил, что этот подход более отзывчив, чем повторное выполнение SQL-запроса каждый раз, даже с кэшированием. Случилось так, что в моем случае запросы были довольно сложными, и производительность SqlCeDataReader была достаточно хорошей, так что снижение производительности было практически незаметным. Не нужно указывать, что после первой пакетной загрузки каждое изменение страницы происходит практически мгновенно, поскольку все хранится в памяти.
Общее мнение моих пользователей состояло в том, что нормально дождаться появления первых результатов, если это впоследствии приведет к более быстрой подкачке страниц. А с помощью LINQ пейджинг так же прост, как и вызов методов Skip и Take. Я реализовал эту логику внутри Pager & Lt; T & Gt; класс, что делает его очень сухим и приятным.
Есть несколько способов, но наиболее упрощенным был бы следующий:
Предполагая
- Размер страницы = 10
- Страница = 2
Тогда
- Первый ТОП = Размер страницы (10)
- Второй ТОП = Размер страницы * Страница (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 перед привязкой к сетке данных.
Это сделало мой пейджинг максимально эффективным. Хотя мне пришлось приложить дополнительные усилия для вставки и удаления записей дел. Но я смог справиться с этим.