从db到代码

时间:2016-09-22 06:18:46

标签: c# nhibernate orm dataset memorystream

我必须从我的数据库中获取大量不同的记录(1000.000)才能根据此数据构建报告。我的数据库在远程系统上。现在我为每个报告都有不同的sql语句。这个sql语句被发送到服务。该服务填充DataSet并将其返回给我的应用程序。现在我可以将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)
     {

     }

1 个答案:

答案 0 :(得分:0)

你应该问的问题是:它有多少数据,什么是内存OVERHEAD。如果OVERHEAD很大,您需要找到更好的数据结构。如果DATA本身对于内存来说太大,则需要探索一次只将其中一部分带入内存的方法。

在任何一种情况下,使用NHibernate报告如此大的卷都是可疑的 - 使用现有的映射类来构造查询会很有用,但是必须包含对简单的未映射DTO类或对象[]的投影。类似的,以避免NHibernate为所有结果实例化映射类 - 后者对性能和内存消耗都不利。

哦,你的意思是你有一个返回DataSet的Web服务吗?这通常被认为是不好的样式,因为DataSet类是特定于Microsoft的,并且由于各种其他原因(http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx)。