Сейчас я пытаюсь использовать OleDb/JET для экспорта данных SQL Server в файл Excel 2003. Я изначально закодировал экспорт в консольном приложении, и оно работало достаточно быстро. Однако выполнение того же кода во время запроса ASP.Net занимает примерно в три раза больше времени. В частности, он замедляется во время вызова OleDbCommand.ExecuteQuery, который вставляет запись в файл Excel.
Единственная разница между ними заключается буквально в том, что один работает в консольном приложении, а другой — в IIS.Помимо этого, оба приложения:
Есть ли что-то изначально медленное при использовании OleDb в ASP.Net, о котором я не знаю?
ОБНОВЛЕНИЕ: Это рассматриваемый код. Команда импорта, используемая как в консольном приложении, так и на сайтах 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();
}
}
}
}