我试图将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
对象?
答案 0 :(得分:1)
答案 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
仅显示当前组: