从数据库到代码的大量未知数据
本文关键字:未知 未知数 数据 数据库 代码 | 更新日期: 2023-09-27 18:08:09
我必须从我的数据库中获得大量不同的记录(1000.000),以便从这些数据构建报告。我的数据库在远程系统上。现在每个报告都有不同的sql语句。这些sql语句被发送到服务。服务填充DataSet并将其返回给我的应用程序。现在我可以将DataSet绑定到报表。问题是具有第三个数记录的数据集具有巨大的内存消耗。我的意思是,如果我加载数据,内存上升到1gb一次加载。
是否有另一种方法来加载数据而不消耗内存?我的意思是我已经使用像NHibernate这样的ORM,但问题是我不知道将加载的数据,有数百个报告与不同的sql语句可以更改,所以我不能创建数百个类来映射…
编辑:下面是我使用的示例代码:
DataSet dataSet = new DataSet();
try
{
using (FbConnection connection = new FbConnection(strConnString))
{
connection.Open();
using (FbCommand cmd =
new FbCommand(
"SELECT * FROM CUSTOMERS;",
connection))
{
FbDataAdapter fbd = new FbDataAdapter(cmd);
fbd.Fill(dataSet);
// This is what the default ADO.Net provider can do..
//SqlCommand command = new SqlCommand(queryString, connection);
//System.Xml.XmlReader reader = command.ExecuteXmlReader();
}
}
}
catch (Exception ex)
{
}
您应该问的问题是:它有多少数据,内存开销是多少。如果开销很大,则需要找到更好的数据结构。如果DATA本身对于内存来说太大,则需要探索一次只将其中一部分放入内存的方法。
无论哪种情况,使用NHibernate来报告如此大的数据量都是可疑的——使用现有的映射类来构造查询是有用的,但是你必须包括一个简单的未映射的DTO类或对象[]或类似的投影,以避免NHibernate为所有结果实例化映射类——后者对性能和内存消耗都不好。
哦,你的意思是你有一个返回数据集的web服务吗?这通常被认为是糟糕的样式,因为DataSet类是特定于microsoft的,并且出于各种其他原因(http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx)。