在从SQL数据库填充大量数据时防止“内存不足”异常

时间:2017-06-29 14:58:23

标签: .net sql-server

如何使用sqldata适配器填充大量数据时防止“Out of Memory”异常。

DataTable dt = new DataTable();
sqlDataAdapter daTest = new sqlDataAdaptor("select * from dailyattendance",sqlconn);
daTest.fill(dt);

2 个答案:

答案 0 :(得分:3)

您应该尝试分页结果,以避免一次性加载所有数据。 MSDN example

orderSQL = "SELECT TOP " + pageSize +   
  " * FROM Orders WHERE OrderID > " + lastRecord + " ORDER BY OrderID";  
adapter.SelectCommand.CommandText = orderSQL;  

dataSet.Tables["Orders"].Rows.Clear();  

adapter.Fill(dataSet, "Orders");  

以下是@Scott提到的SQL Server 2012+的示例

SELECT * 
FROM [dailyattendance]
OFFSET @PageSize * (@PageNumber - 1) ROWS
FETCH NEXT @PageSize ROWS ONLY;

您必须使用parameters来填充@PageSize@PageNumber

答案 1 :(得分:0)

我是Michael的第二个答案,因为我们应该将结果分页并加载它。但是在考虑我们需要将所有内容加载到内存以进行某些处理的场景。在这种情况下,您可以使用MemoryFailPoint Class

try
 {
  using (MemoryFailPoint point = new MemoryFailPoint(100000))
   {
    // An exception is thrown at this point.
    //  does not have enough memory.
    // We can do our datatable operation here
    }
   }
  catch (InsufficientMemoryException e)
  {
    // MemoryFailPoint threw an exception
   }
  

创建MemoryFailPoint类的实例会创建一个内存   门。内存门在启动之前检查足够的资源   需要大量内存的活动。检查失败   导致抛出InsufficientMemoryException异常。这个   异常会阻止操作启动并减少操作   由于缺乏资源而导致失败的可能性。这使你   降低性能以避免OutOfMemoryException异常和   因处理不当而导致的任何国家腐败   代码中任意位置的异常。

请注意,MemoryFailPoint远非完美,可以找到更多详细信息here here