Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
大型查询如何在C#/ASP.NET MVC 4节中返回结果_C#_Json_Ajax_Asp.net Mvc 4_Oledbdatareader - Fatal编程技术网

大型查询如何在C#/ASP.NET MVC 4节中返回结果

大型查询如何在C#/ASP.NET MVC 4节中返回结果,c#,json,ajax,asp.net-mvc-4,oledbdatareader,C#,Json,Ajax,Asp.net Mvc 4,Oledbdatareader,我有一个用ASP.NETMVC4编写的应用程序。我需要从使用oledbdatareader访问的表返回大型结果 我使用AJAX返回一个JsonResult对象,该对象包含一个列表:List 我不明白的是,如果我在DataReader循环中 using (OleDbDataReader reader = command.ExecuteReader()) { while (reader.Read()) { names.Add(Convert.ToString(reader[

我有一个用ASP.NETMVC4编写的应用程序。我需要从使用oledbdatareader访问的表返回大型结果

我使用AJAX返回一个JsonResult对象,该对象包含一个列表:
List

我不明白的是,如果我在DataReader循环中

using (OleDbDataReader reader = command.ExecuteReader())
{
   while (reader.Read())
   {
       names.Add(Convert.ToString(reader[0]));
   }
}

是否有方法定期发送列表对象,然后创建新对象以拾取并继续

从技术上讲,服务器只能对每个请求返回一个响应,因此没有办法做您想做的事情(除非设置一些疯狂的套接字)

我将翻转您正在做的事情,让您的javascript请求数据集块成批处理1000个(或任意大小),并让它在请求下一个数据块时开始渲染


更好的是,您可以在UI中实现某种形式的无限滚动,以便下一个区块只被及时请求以便显示,这样您就不会向客户端发送不需要的数据。

从技术上讲,服务器只能对每个请求返回一个响应,因此无法执行您想要的操作(除了设置一些疯狂的插座)

我将翻转您正在做的事情,让您的javascript请求数据集块成批处理1000个(或任意大小),并让它在请求下一个数据块时开始渲染


更好的是,你可以在你的UI中实现某种形式的无限滚动,这样下一个数据块就可以及时被请求显示,这样你就不会向客户端发送不需要的数据。

我认为你有一些非常常见的选项可以实现。如果你有10000条记录需要返回给c客户端,您可以在MVC应用程序中对此进行管理。如果您使用的是实体框架和Linq,您可以编写业务逻辑,以便每次用户单击“下一步”按钮时返回100行。这将使到客户端的传输变小,甚至使从web服务器到SQL server的调用变小

如果您不想让用户单击下一步按钮(即分页),而是想使用无限滚动样式,那么只需执行相同的操作,因为用户一直滚动,只需不断调用Ajax方法,一次发送回每100行

web服务器和数据库服务器不会阻塞10000条记录;它会阻塞到客户端。即使您在Signal R中打开一个套接字,我想您应该问问自己,我真的需要一次将10000行全部推送到客户端吗

想想手机上的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

来源:

我认为您有一些非常常见的实现选项。如果您有10000条记录需要返回给客户端,您可以在您的MVC应用程序中管理这些记录。如果您使用的是实体框架和Linq,您可以编写业务逻辑,以便每次用户单击下一个按钮时返回100行n、 这将使到客户端的传输变小,甚至使从web服务器到SQL服务器的调用变小

如果您不想让用户单击下一步按钮(即分页),而是想使用无限滚动样式,那么只需执行相同的操作,因为用户一直滚动,只需不断调用Ajax方法,一次发送回每100行

web服务器和数据库服务器不会阻塞10000条记录;它会阻塞到客户端。即使您在Signal R中打开一个套接字,我想您应该问问自己,我真的需要一次将10000行全部推送到客户端吗

想想手机上的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

来源:

至于疯狂的套接字,也许我可以使用“signar”来处理,但我现在还不想依赖它,而是想找到一个替代方法。因此,对于批量数据集请求,这更难,因为表不是索引(也许我可以要求完成)但我不知道如何沟通停止和启动每个新查询的位置(如果我理解正确的话),最终我想阻止数据结构变得太大。如果我能为每一行获得一个id,我可能会这样做。至于疯狂的套接字,也许我可以使用“信号器”但是,我宁愿现在还不依赖于此,并找到一个替代方法。因此,对于成批的数据集请求,这更为困难,因为表不是索引(也许我可以要求这样做),但我不知道如何沟通停止和启动每个新查询的位置(如果我理解正确的话)最终,我希望阻止数据结构变得太大。如果我可以为每一行获取一个id,我可能只会这样做。显示数据的要求是什么?是否有一个不能使用表(网格)的原因使用分页功能,用户可以将返回的数据量调整为10行、25行、50行或100行,然后单击箭头来回翻页?我可以使用网格,但问题是,我正在寻找一种以数据包的形式发送数据的方法,而不是一次填充数据结构,然后将其传递给客户端。没有吗我以前真的做过,所以我想看看web应用程序的正常流程是什么,但我可能只是依靠Signaler并试一试。显示数据的要求是什么?有什么原因吗