2016-09-22 56 views
0

我必须从我的数据库获取大量不同的记录(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) 
    { 

    } 

回答

0

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

在这两种情况下,使用NHibernate报告这样大的卷是令人怀疑的 - 使用现有的映射类来构造查询可能是有用的,但是您必须包括投影到简单的未映射DTO类或对象[]或类似的,以避免NHibernate为所有结果实例化映射类 - 后者对性能和内存消耗都不利。

哦,你是不是说你有一个Web服务返回一个DataSet?一般来说,这被认为是不好的风格,因为DataSet类是特定于Microsoft的,并且出于各种其他原因(http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx)。

+0

该web服务仅供我的应用程序使用。我必须从数据库加载数据,并且DataSet是实现它的唯一方法,按照我使用的firebird和ADO.Net提供程序的方式。如果我将DataSet解析为XML或Json或其他内容,则会出现额外的性能问题。我的意思是,如果有可能直接将数据加载到XML中,那会更好,但目前为止还没有发现。唯一的方法是将其加载到DataSet中,然后将其写入XML。 oroginal SQLCommand类具有类似于ExecuteXmlReader()的东西,但没有任何此类Firebird提供者(FBCommand)。 – Franki1986

+0

这里有些东西...... ADO.Net的基本返回结构是* DataReader *,而不是DataSet。虽然框架提供了将DataReader读入DataSet的方便方法,但据我所知,这是ADO.Net的用户必须明确执行的。 –

+0

我放了一些代码来解释我的意思。 – Franki1986