【问题标题】:How get huge data from sql server using ado.net?如何使用 ado.net 从 sql server 获取大量数据?
【发布时间】:2014-04-02 08:33:27
【问题描述】:

我在获取数据时遇到错误

抛出了“System.OutOfMemoryException”类型的异常

错误获取线路是dataAdapter.Fill(dataTable);

我的表中有 (2826000) 条记录。

这是我正在使用的代码。

var dataTable = new DataTable();
var DicTableNameAndValues = new Dictionary<string, object>();

using (var connection = new SqlConnection(ConnectionString))
{
    connection.Open();
    var dataQuery = "SELECT * FROM  " + table;
    using (var command = new SqlCommand(dataQuery, connection))
    {
        var dataAdapter = new SqlDataAdapter(command);
        dataAdapter.Fill(dataTable);
        var result = dataTable.AsEnumerable().Skip(skip).Take(pageSize).ToList().Select(c => c.ItemArray);
        DicTableNameAndValues.Add(table, result);

    }
}

【问题讨论】:

  • 你确定吗?这个方法的documentation 并没有说它会抛出OutOfMemoryException
  • 从数据库中只获取所需数量的记录,而不是将所有记录都带到客户端然后只取出其中的几条,怎么样?

标签: c# ado.net


【解决方案1】:

您可以根据应用程序的要求获取一定数量的记录,而不是所有记录。你可以创建一个存储过程,效果如下。

--Create a stored procedure with following parameters
DECLARE @skip int, @pagesize int

--Added testing values
SELECT @skip = 4, @pagesize = 3

--Give @tbl with your table name. 
/*If you already have an identity key then probably row_number function might not 
be required. But if the records are getting deleted as well then row_number is a
better option*/
SELECT * FROM
(SELECT ROW_NUMBER() over(ORDER BY Your_Col) AS ROWNUM, * FROM @tbl) as tbl
WHERE ROWNUM BETWEEN (@skip * @pagesize) + 1 and (@skip + 1) * (@pagesize)

希望这会有所帮助。

【讨论】:

  • 嘿 Samar,谢谢.. 它正在工作,但有些表我有复合键作为主键。所以我得到了混乱的数据(比如顺序不正确)。
  • 你在使用 ROW_NUMBER 函数吗?如果是,那么您可以在 order by 中给出多个列名,如下所示。 SELECT ROW_NUMBER() over(ORDER BY Your_Col1, Your_Col2) AS ROWNUM,...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2011-01-25
相关资源
最近更新 更多