【发布时间】:2012-03-09 22:24:30
【问题描述】:
我目前正在尝试使用 OleDb/JET 将 SQL Server 数据导出到 Excel 2003 文件。我最初在控制台应用程序中对导出进行了编码,它运行得足够快。但是,在 ASP.Net 请求期间运行相同的代码大约需要三倍的时间。具体来说,它在调用 OleDbCommand.ExecuteQuery 时变慢了,这会将记录插入 Excel 文件。
两者之间的唯一区别实际上是一个在控制台应用程序中运行,另一个在 IIS 中运行。除此之外,这两个应用程序都是:
- 在我的开发机器上运行
- 从两个应用程序引用的共享 dll 运行与以下相同的代码
- 使用相同的连接字符串连接到同一个数据库
- 使用完全相同的 select 语句和完全相同的参数值
- 在我的开发机器上的相同位置创建一个全新的文件并写入它
- 逐字节生成相同文件
在我不知道的 ASP.Net 中使用 OleDb 时是否存在固有的缓慢问题?
更新:这是有问题的代码。控制台应用程序和 ASP.Net 站点中使用的导入命令是相同的。它们都连接到我机器本地的数据库,并且两个应用程序都在我的机器上运行。
public void Convert(IDbCommand importCommand, string savePath, string sheetName)
{
var excelConnString = new OleDbConnectionStringBuilder();
excelConnString.Provider = "Microsoft.ACE.OLEDB.12.0";
excelConnString.DataSource = savePath;
excelConnString["Extended Properties"] = "Excel 8.0;HDR=Yes";
using (var dr = importCommand.ExecuteReader())
{
var columnCount = dr.FieldCount;
using (var oleConn = new OleDbConnection(excelConnString.ToString()))
{
oleConn.Open();
var headers = new string[columnCount];
var formattedHeaders = new List<string>();
var qs = new List<string>();
var insertCmd = oleConn.CreateCommand();
for (var curCol = 0; curCol < dr.FieldCount; curCol++)
{
var name = dr.GetName(curCol);
headers[curCol] = name;
formattedHeaders.Add("[" + name + "]");
qs.Add("?");
insertCmd.Parameters.Add(name, OleDbType.LongVarChar, 20000);
}
using (var cmd = oleConn.CreateCommand())
{
cmd.CommandText = string.Format("create table {0}({1})", sheetName,
string.Join(",", formattedHeaders.Select(x => x + " longtext")));
cmd.ExecuteNonQuery();
}
insertCmd.CommandText = string.Format("insert into {0} ({1}) values ({2})", sheetName, string.Join(",", formattedHeaders), string.Join(",", qs));
insertCmd.Prepare();
var values = new object[columnCount];
while (dr.Read())
{
dr.GetValues(values);
for (var i = 0; i < columnCount; i++)
{
insertCmd.Parameters[headers[i]].Value = values[i];
}
insertCmd.ExecuteNonQuery();
}
}
}
}
【问题讨论】:
-
一个疯狂的猜测 - 如果控制台应用程序只写入 Excel 文件,但 ASP.Net 以这样的模式打开它,在 Excel 内部有重新计算/刷新......
-
@deathApril:在这两种情况下,他们每次都在创建一个新文件。这些文件是相同的。我会更新我的问题以提及这一点。
-
他们是否使用相同的
COM方法和相同的参数来创建和写入 Excel 文件? -
正如我在问题中提到的,它们实际上是在运行具有相同数据的相同代码。代码位于每个项目引用的第三个 C# dll 中。
-
感谢您的帮助,但“显然”?无需花言巧语