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