我有一个用 MVC 4 编写 ASP.NET 应用程序。我需要从使用 oledbdatareader 访问的表中返回大结果。
我正在使用 AJAX 返回一个包含 List:List<TableRow>
的 JsonResult 对象
我不明白的是,如果我在DataReader循环中
using (OleDbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
names.Add(Convert.ToString(reader[0]));
}
}
有没有办法定期发送列表对象,然后创建一个新对象来拾取并继续?
从技术上讲,服务器只能为每个请求返回一个响应,因此无法做您想要的操作(除了设置某种疯狂的套接字内容)。
我会颠倒你正在做的事情,让你的javascript批量请求数据集的块,每批1000个(或任何大小),并让它在请求下一个块时开始渲染。
更好的是,您可以在 UI 中实现某种形式的无限滚动,以便仅及时请求下一个块以显示它,这样您就不会向客户端发送不需要的数据。
我认为您有一些相当常见的选项来实现。如果需要向客户端提供 10,000 条记录,则可以在 MVC 应用程序中对此进行管理。如果您使用的是实体框架和 Linq,则可以编写业务逻辑,以便每次用户单击"下一步"按钮时仅发回 100 行。这将使到客户端的传输保持较小,甚至保持从 Web 服务器到 SQL 服务器的调用较小。
如果您不想让用户单击下一个按钮(即分页),但希望执行无限滚动样式,那么只需执行相同的操作,当用户不断滚动时,只需继续调用 Ajax 方法一次发回每 100 行。
Web 服务器和数据库服务器不会阻塞 10,000 条记录;它会窒息到客户端。 即使您在 Signal R 中打开一个套接字,我认为您也应该问问自己,我真的需要一次将 10,000 行推送给客户端吗?
想想手机上的Twitter应用程序,他们在你滚动时向你发送数据,他们不是一次发送所有数据。 这有帮助吗?
根据您对直接SQL的评论进行了更新
下面是在 SQL 中执行简单分页版本的示例:
DECLARE @intStartRow int;
DECLARE @intEndRow int;
SET @intStartRow = (@intPage -1) * @intPageSize + 1;
SET @intEndRow = @intPage * @intPageSize;
WITH blogs AS
(SELECT strBlogName,
ROW_NUMBER() OVER(ORDER BY intID DESC) as intRow,
COUNT(intID) OVER() AS intTotalHits
FROM tblBlog)
SELECT strBlogName, intTotalHits FROM blogs
WHERE intRow BETWEEN @intStartRow AND @intEndRow
来源: http://joelabrahamsson.com/my-favorite-way-to-do-paging-with-t-sql/