C# 将海量数据从数据库层传递到表示层

C# 将海量数据从数据库层传递到表示层,c#,architecture,datatable,sqldatareader,C#,Architecture,Datatable,Sqldatareader,我有三层应用程序,其中所有与数据库相关的操作都在数据库层执行 对于一些在sqldatareader中获取大量数据的查询(大约1000万行,32列),我的问题是如何将这些大数据传递到表示层,在那里生成一些报告 经过分析,我有以下选项,请分享您的意见相同 传递sqlDatareader本身 这实际上不是我的想法,因为我必须一直保持连接打开 使用数据表 将sqldatareader加载到datatable中,并将其作为返回语句传递。 这听起来不错,但我不确定这是正确的方法,在这种情况下,我想知道

我有三层应用程序,其中所有与数据库相关的操作都在数据库层执行

对于一些在sqldatareader中获取大量数据的查询(大约1000万行,32列),我的问题是如何将这些大数据传递到表示层,在那里生成一些报告

经过分析,我有以下选项,请分享您的意见相同

  • 传递sqlDatareader本身

    • 这实际上不是我的想法,因为我必须一直保持连接打开
  • 使用数据表

    • 将sqldatareader加载到datatable中,并将其作为返回语句传递。 这听起来不错,但我不确定这是正确的方法,在这种情况下,我想知道它是否会影响应用程序的整体性能
  • 使用列表作为自定义对象

  • 它基于winform的应用程序仅安装在单机上,我使用的是.NETFramework 3.5


    非常感谢您的意见和反馈。

    一次传递这么多数据真的有必要吗?这不是更好吗?它会解决你很多问题。不管怎样,谁想在一个页面上看到1000万数据?谁愿意等待5分钟直到页面加载所有数据


    如果您有三层体系结构,您可能希望使用一些业务对象而不是对象与数据库直接通信。表示层应该对所使用的数据库一无所知或知之甚少。因此,在您的数据库层中,获取加载的数据,将其存储在业务对象中,并将这些对象传递到表示层。

    **传递sqldatareader将花费您大量的网络使用,因此不建议将连接保持长时间打开

    **使用datatable是一个更好的选择,但这取决于您希望对这些庞大数据执行何种操作。默认情况下,datatable最多可以容纳16777216行


    在这两个应用层中,第二个更可取,并提供良好的性能。您不应该将SQLDataReader或DataTable传递给另一个应用层,这将暴露DAL和数据库模型实现,并破坏应用层的分离。 也就是说,SQLDataReader保持与数据库的开放连接。因此,您应该读取所需的所有行,并尽早将其关闭。 在设计方面,您应该使用自己的类来表示数据。
    无论如何,您确定在表示层中需要这么多行吗?听起来很奇怪。

    顺便说一句,你想用演示层中的1000万条记录做什么?@Szymon请看一下更新问题。事实上,我正在以预定义格式导出excel表格中的这些大数据,请看一下更新的问题。好吧,这不会改变任何事情。因此,我们仍然可以使用部分数据进行数据分析。拿几千块,做分析,写结果。这是可能的,还是你真的,我的意思是,真的,需要一次加载所有数据?在这种情况下,有专门设计的类可以高效地将数据从数据库导出到excel…也许你应该尝试一下…最好的方法是将数据导出到.csv格式,excel处理这种格式