用C#实现对Excel的SQL查询

tpxzln5u  于 2022-09-18  发布在  Java
关注(0)|答案(3)|浏览(269)

我一直在与这个问题作斗争。我正在编写一个程序,处理一些大量的数据,这些数据存放在服务器上的SQL数据库中。一个包含50列的表中有数百万条记录。

我的程序所做的第一件事是执行一个查询来检索一组这样的数据。集合大小从500条记录到150万条记录不等。150万是相当罕见的,但它是可能发生的。目前,我正在检索数据并将其存储在数据表中,然后使用EPPlus将其导出到EXCEL。我开始耗尽大约150,000条记录的内存。整个任务大约需要2-3分钟才能完成。我相信我在填充数据表时内存正在耗尽。

数据在SQL数据库中的服务器上,我们必须有一个导出的EXCEL文件到我们的本地计算机。这些标准必须继续得到满足。

我到底该怎么做呢?

编辑:以下是一些示例代码。我还应该更新我不关心格式。

string query = "SELECT * FROM DB.dbo.Table WHERE [Client Name] = '" + clientName + "'";
System.Data.DataTable dt = new System.Data.DataTable();
using (SqlConnection sqlConn = new SqlConnection(connString))
{
     using (SqlCommand cmd = new SqlCommand(query, sqlConn))
{
     sqlConn.Open();
     using (SqlDataReader myReader = cmd.ExecuteReader())
     {
           dt.Load(myReader);
           sqlConn.Close();
     }
}
}

我想我需要在更大的层面上做出调整。正如你们中的许多人所说的,不可能处理如此多的行。我将从整体上看另一种解决问题的方法。感谢大家的帮助!

piah890a

piah890a1#

显然,DataTable在这方面帮不上忙。您可以直接使用StramWriter而不使用DataTable,并直接写入CSV文件而不是Excel文件(您的问题不是显示您需要公式、格式等)。

此外,将自己放在最终用户的位置上也会有所帮助。用户可能会发现处理一百万行的EXCEL文件的问题。

xdnvmnnf

xdnvmnnf2#

首先,您已经在使用SqlDataReader。这意味着要逐个记录地处理。如果您创建一个

while (reader.Read())
{
   // Export row
}

循环,您应该不会遇到内存问题-但是,它可能会很慢。

在上面的// Export row部分中,您可能想要使用ADO写入到Excel工作表,这基本上归结为打开到SQL文件的数据库连接和e1d2d1,就像您插入到普通数据库中一样。上面应该有代码,以便向您展示如何执行此操作(例如this one)。

[关于我会如何做的附注:

我会在我的应用程序资源中创建一个Excel模板文件。然后,我会将其保存到磁盘上,以便在每次导出时创建一个新文件,然后构造一个连接字符串来访问该新文件。然后我会使用普通的OleDbCommands插入。

]

然而,正如其他人已经注意到的那样,Excel无法处理150万行的数据量。

tzxcd3kk

tzxcd3kk3#

如果要为每个单元格或每行设置值和格式,则需要花费时间。

您应该始终使用set_range(“A1:A50”)=字符串数组。您可以创建一个50字符串的字符串数组,并使用set_range()进行设置;

我不知道EPPlus释放,如果你创建了很多对象来设置你的数据表,而不是释放它,它会抛出内存问题,因为那些可能不是CLR对象。

您可以尝试使用多个工作表来写入数据,以便于用户阅读。

相关问题