限制您使用DataTable

时间:2014-01-03 08:08:42

标签: c# datatable sqldatareader

我最近看到了这个,见下文。使用OutofMemoryException加载250万条记录时,我获得了DataTable。在底部附近,有一个table.Dispose()。内存使用量:560Mb!为什么还要使用DataTable

public string[] GetIDs()
{
   DataTable table = new DataTable();
   using (SqlConnection dwConn = new SqlConnection(this.ConnectionString))
   {
      dwConn.Open();
      SqlCommand cmd = dwConn.CreateCommand();
      cmd.CommandText = "SELECT ID FROM Customer";
      SqlDataReader reader = cmd.ExecuteReader();
      table.Load(reader);
    }
    var result = new string[table.Rows.Count];
    for(int i = 0; i < result.Length; i++ )
    {
       result[i] = table.Rows[i].ItemArray[0].ToString();
    }
    table.Dispose();
    table = null;
    return result;
}

2 个答案:

答案 0 :(得分:0)

我在下面对此进行了转换,现在使用的内存为250万条记录,与上述相同。使用的内存现在不到原来的45%。

public IEnumerable<String> GetIDs()
{
    var result = new List<string>();
    using (var dwConn = new SqlConnection(ConnectionString))
    {
        dwConn.Open();
        SqlCommand cmd = dwConn.CreateCommand();
        cmd.CommandText = "SELECT ID FROM Customer";
        using (SqlDataReader reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                result.Add(reader["ID"].ToString());
            }
        }                
    }
    return result;
}

答案 1 :(得分:0)

很高兴看到您的解决方案存在问题,但我还建议您查看this discussion,其中描述DataReader是比DataTable更好的解决方案,但是it depends on it use as wellAfter reading this你会理解,在DataReader的情况下,内存消耗预计会减少。

MSDN documentation中记录了使用SqlDataReader的另一个优点:

来自Remarks的部分:

  

数据时由另一个进程或线程对结果集所做的更改   正在读取的内容可能对SqlDataReader的用户可见。

因此,你可能会在观察中获得这种差异。

希望它对你和其他人也有用。