Ограничение количества строк, загружаемых через SQL, ограничивает их либо качественно (ГДЕ ...), либо через довольно тупое предложение LIMIT. Вы также можете использовать DataAdapter
для загрузки строк на «страницах» или в группах - бит за раз. Это использует MySQL, но он работает со многими из другого (все?) Из DBProviders:
int pageSize = 10000;
int page = 0;
...
Начальная загрузка:
string SQL = "SELECT * FROM Sample";
using (MySqlConnection dbCon = new MySqlConnection(MySQLConnStr))
{
dtSample = new DataTable();
daSample = new MySqlDataAdapter(SQL, dbCon);
daSample.FillSchema(dtSample, SchemaType.Source);
dbCon.Open();
int Rows = daSample.Fill((page*pageSize), pageSize, dtSample);
}
dgv2.DataSource = dtSample;
this.lblPages.Text = String.Format("Rows {0} - {1}",
((page * pageSize) + 1),
(page + 1 * pageSize));
page += 1;
Ключ от перегрузки DataAdapter(int, int, DataTable)
: она позволяет указать первая строка и количество загружаемых строк. Вместо того, чтобы воссоздавать DataAdapter
для каждой страницы, я бы использовал один уровень формы/класса. Читая следующие страницы оставляет несколько вариантов:
dgv2.SuspendLayout();
dtSample.Rows.Clear();
int Rows = daSample.Fill((page * pageSize), pageSize, dtSample);
dgv2.ResumeLayout();
this.lblPages.Text = String.Format("Rows {0} - {1}",
((page * pageSize) + 1),
(page + 1 * pageSize));
if (Rows != pageSize) // last page?
page = 0;
else
page += 1;
Если вы сделать не четкие строки, то DataTable
будет накапливать их: то есть, после загрузки второго набора, он будет иметь все строки для страниц 1 и 2.
Может быть полезно, чтобы они могли накапливаться, чтобы каждый заданный набор загружался только один раз. Если важно по-прежнему ограничить отображение одной страницей за раз, вы можете использовать DataView
для отображения только текущей группы:
Да, все данные, возвращаемые запросом, будут заполнены в DataTable. Вы можете изменить запрос, используя предложение where, чтобы регистрировать данные –
Он получает все данные, которые удовлетворяют запросу, который вы предоставляете. –