SqlDataAdapter :: Fill是否可以获取整个结果集还是按需获取?

时间:2016-08-08 12:13:03

标签: c# sql .net datagridview sqldataadapter

我试图将DataGridView连接到SQL Server,https://stackoverflow.com/a/18113368/492336中概述的解决方案使用SqlDataAdapter和DataTable:

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连接到服务器,以便它可以按需获取新行。

例如,如果表有100万行,那么在SqlDataAdapter :: Fill返回之前,是否所有这些行都被提取并写入DataTable对象?

2 个答案:

答案 0 :(得分:1)

是的,它将创建对象并将在您的网格视图上实现以显示您的所有数据,问题是您如何编写SQL查询,您可以使用一些SQL关键字限制数据行,如TOP,LIMIT,OFFSET 。

答案 1 :(得分:1)

限制通过SQL加载的行数限制它们(WHERE ...)或通过相当钝的LIMIT子句限制它们。您还可以使用try - catch在"页面中加载行"或团体 - 一次一点。这使用MySQL,但它可以与许多其他(全部?)DBProviders一起使用:

DataAdapter

初始加载:

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; 将累积它们:也就是说,在加载第二组之后,它将包含第1页和第2页的所有行。 / p>

允许它们累积以使任何给定的集仅加载一次是有用的。如果仍然一次将显示限制为一页很重要,则可以使用DataTable仅显示当前组: