我正在从excel读取数据并将其加载到datatable中。我的问题是它在加载大型Excel文件时给出了SystemOutOfMemoryException。 excel中的colomns没有修复,因此我无法在sql表中加载该数据。 我需要对数据进行一些操作,所以我将它加载到datatable中。 有谁能建议我如何解决这个问题?
我这样做
OleDbConnection conn = new OleDbConnection();
OleDbCommand cmd = new OleDbCommand();
OleDbDataAdapter da = new OleDbDataAdapter();
conn = new OleDbConnection(GetOleDbConnectionString(strFileType, strNewPath));
if (conn.State == ConnectionState.Closed) conn.Open();
string query = null;
DataTable dt = new DataTable();
query = "SELECT * FROM [" + SpreadSheetName + "]";
cmd.Connection = conn;
cmd.CommandText = query;
da.SelectCommand = cmd;
da.Fill(dt);
da.Dispose();
conn.Close();
conn.Dispose();
答案 0 :(得分:0)
您的问题是内存不足 - 可能您的应用程序以32位应用程序运行,而您加载的所有内容都会超载它。
使其成为64位应用程序(在可执行项目下的设置中) - 并确保您的物理内存足以用于现代机器(8 + gb)。
答案 1 :(得分:0)
您正在将整个Excel工作表的数据加载到内存中,从不这样做,很少有环境变量进入可用内存的情况,如果应用程序部署在另一台机器上可能会更改,并且列中填入excel表 - 如果全部这些列使用冗长的文本,然后几千条记录就足以耗尽内存。
更好的方法是触发查询以仅获取列名称,如
query = "SELECT * FROM [" + SpreadSheetName + "]" where 1=2"
这将为您提供所有列名,使用它来在数据库中创建表。 创建表后,要么一次加载少量记录,并在有限的记录中进行操作,并重复直到结束。