如何使用sqldata适配器填充大量数据时防止“Out of Memory”异常。
DataTable dt = new DataTable();
sqlDataAdapter daTest = new sqlDataAdaptor("select * from dailyattendance",sqlconn);
daTest.fill(dt);
答案 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异常和 因处理不当而导致的任何国家腐败 代码中任意位置的异常。