2016-08-08 4 views
1

Я пытался подключить DataGridView к SQL Server, и решение описано в https://stackoverflow.com/a/18113368/492336 использует SqlDataAdapter и DataTable:Does SqlDataAdapter :: Заполнить выборку всего набора результатов или по требованию?

var adapter = new SqlDataAdapter("select * from foo", "server=myhost-pc\\sqlexpress;trusted_connection=yes;database=test1"); 
var table = new DataTable(); 
adapter.Fill(table); 
view.DataSource = table; 

Я пытаюсь выяснить, если этот метод извлекает весь набор данных из сервер, или если он подключает DataGridView к серверу, чтобы он мог получать новые строки по требованию.

Например, если таблица имеет 1 миллион строк, все они будут извлечены и записаны в объект DataTable до возврата SqlDataAdapter :: Fill?

+0

Да, все данные, возвращаемые запросом, будут заполнены в DataTable. Вы можете изменить запрос, используя предложение where, чтобы регистрировать данные –

+0

Он получает все данные, которые удовлетворяют запросу, который вы предоставляете. –

ответ

1

Ограничение количества строк, загружаемых через 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 для отображения только текущей группы:

+1

Этот ответ очень подробный, спасибо. Так, как я использовал его, он извлекал все данные, но есть способ сделать его по требованию в конце концов. – sashoalm

+0

Вы можете комбинировать с ним ограничения SQL, такие как 'WHERE Active = True', а затем загружать * это * подмножество на страницах. – Plutonix

1

Да, он будет создавать объект и будет реализовывать на экране сетки, чтобы показать все данные, дело в том, что, как вы пишете SQL-запрос, вы можете ограничить строки данных, используя некоторые ключевые слова SQL, такие как TOP, LIMIT, OFFSET.

Смежные вопросы