SQLDataAdapter Fill 方法如何触发数据库查询?

Posted

技术标签:

【中文标题】SQLDataAdapter Fill 方法如何触发数据库查询?【英文标题】:How SQLDataAdapter Fill method fires Database Queries? 【发布时间】:2011-12-08 06:34:02 【问题描述】:

我有一个关于 SQLDataAdapter 填充方法的查询,该方法采用 startRecord、MaxRecord 等参数,如下所示 -

SqlDataAdapter adap = new SqlDataAdapter ("Select * from tblname",ConnectionString);
DataSet ds = new DataSet();
adap.Fill(ds, startIndex, MaxRecords , "TableName");

我想知道 SqlDataAdapter 会做什么。

它会首先触发从表中带回整个记录的查询,然后从表中过滤行吗?

它会在数据库中触发一个只选择所需行数的查询吗?

【问题讨论】:

【参考方案1】:

sqlDataAdapter.Fill(dataSet, currentIndex, pageSize, "TableName"); 将查询整个结果集,然后将它们分页到内存中。

对于大型结果集,这不是您想要的。如果您希望在服务器上进行分页,请在您使用的 SQL 中使用 SKIP 和 TOP 子句。

Here 是解释这一点的文档。

【讨论】:

【参考方案2】:

SqlDataAdapter 作为 DataSet 和 SQL Server 的桥梁,用于检索和保存数据。 当 SqlDataAdapter 填充 DataSet 时,它将为返回的数据创建必要的表和列(如果它们尚不存在)。

这是让你更好理解的代码段

string sqlStatement = "Select * from tblname ";
                SqlCommand cmd = new SqlCommand(sqlStatement, con);
                DataSet ds = new DataSet();

                SqlDataAdapter adap = new SqlDataAdapter(cmd);
                cmd.ExecuteNonQuery();
                adap.Fill(ds);

【讨论】:

那么,sqladapter 将触发什么查询? sqladapter 是一组用于填充数据集的命令和连接... 那么,sqladapter 将触发什么查询?它会触发会带来整行数据的查询,还是会触发只会获取选定行的查询? 它将基于 sqlstatement 进行数据集。例如,如果您的 sqlstatement 返回 10 行,那么 sqladapter 将填充数据集中的 10 行。 好的,如果我的选择查询返回 1000 行,并且如果我在查询中放置了一个过滤器(使用 SqlAdpater 填充方法),限制和偏移量,比如说假设 10 行。那将是什么查询会被解雇吗?

以上是关于SQLDataAdapter Fill 方法如何触发数据库查询?的主要内容,如果未能解决你的问题,请参考以下文章

SqlDataAdapter.Fill 方法慢

SqlDataAdapter.Fill 方法慢

SqlDataAdapter使用Fill方法填充DataSet

SqlDataAdapter.Fill 方法不会给出任何错误,但也不会返回任何数据以用于长时间运行的查询 ado.net core SQL Server

与 SqlDataAdapter.Fill() 相比,DataTable.Load() 花费了太多时间

SqlDataAdapter.Fill 即使是一条记录也太慢了