Изменяется производительность OleDb?

Сейчас я пытаюсь использовать OleDb/JET для экспорта данных SQL Server в файл Excel 2003. Я изначально закодировал экспорт в консольном приложении, и оно работало достаточно быстро. Однако выполнение того же кода во время запроса ASP.Net занимает примерно в три раза больше времени. В частности, он замедляется во время вызова OleDbCommand.ExecuteQuery, который вставляет запись в файл Excel.

Единственная разница между ними заключается буквально в том, что один работает в консольном приложении, а другой — в IIS.Помимо этого, оба приложения:

  • работают на моем компьютере для разработки
  • выполняют тот же код, что и ниже, из общей dll, на которую ссылаются оба приложения
  • подключаются к одной и той же базе данных с одной и той же строкой подключения
  • с использованием точно такой же оператор select с теми же точными значениями параметров
  • создание нового файла в том же месте на моем компьютере для разработки и запись в него
  • создание побайтно идентичных файлов

Есть ли что-то изначально медленное при использовании 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();
            }
        }
    }
}
6
задан rossisdead 9 March 2012 в 23:43
поделиться