Ограничение количества строк, загружаемых через SQL, ограничивает их либо качественно (WHERE...), либо с помощью довольно грубого предложения 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
для отображения только текущей группы:
person
Ňɏssa Pøngjǣrdenlarp
schedule
08.08.2016