C# 可变OleDb性能?

C# 可变OleDb性能?,c#,asp.net,excel,oledb,C#,Asp.net,Excel,Oledb,我目前正在尝试使用OleDb/JET将SQL Server数据导出到Excel 2003文件。我最初在一个控制台应用程序中编写了导出代码,它运行得足够快。但是,在ASP.Net请求期间运行相同的代码所需的时间大约是原来的三倍。具体来说,在调用OleDbCommand.ExecuteQuery(将记录插入Excel文件)期间,速度会减慢 两者之间的唯一区别是一个运行在控制台应用程序中,另一个运行在IIS中。除此之外,这两种应用程序都是: 在我的开发机器上运行 从两个应用程序都引用的共享dll运行

我目前正在尝试使用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();
            }
        }
    }
}
public void Convert(IDbCommand importCommand,string savePath,string sheetName)
{
var excelConnString=新的OleDbConnectionStringBuilder();
excelConnString.Provider=“Microsoft.ACE.OLEDB.12.0”;
excelConnString.DataSource=保存路径;
excelConnString[“扩展属性”]=“Excel 8.0;HDR=Yes”;
使用(var dr=importCommand.ExecuteReader())
{
var columnCount=dr.FieldCount;
使用(var-olleconn=new-OleDbConnection(excelConnString.ToString()))
{
尺骨鹰嘴开();
var headers=新字符串[columnCount];
var formattedHeaders=新列表();
var qs=新列表();
var insertCmd=oleConn.CreateCommand();
对于(var curCol=0;curColx+“longtext”);
cmd.ExecuteNonQuery();
}
insertCmd.CommandText=string.Format(“插入到{0}({1})值({2})”,sheetName,string.Join(“,”,formattedHeaders),string.Join(“,”,qs));
insertCmd.Prepare();
var值=新对象[columnCount];
while(dr.Read())
{
dr.GetValues(值);
对于(变量i=0;i
在您评论这是从aspx页面上的按钮处理程序调用的之后,我认为额外的延迟来自会话锁

即使不使用会话,会话也会锁定整个请求,直到此工作完成和页面结束。此锁可以延迟请求,如果您对同一路由进行两个或三个调用,一个会锁定另一个,但如果您看到其他页面,会话锁也会增加额外的延迟

要避免此会话锁定,只需通过set
EnableSessionState=“false”

再看看


我想这可能会让你头脑清醒

听起来你需要

这可能值得注意。也许他们知道一些未记录的实现

Access数据库引擎2010不可再发行。。。(to)由系统服务或服务器端程序使用,其中代码将在系统帐户下运行,或将同时处理多个用户身份,或高度可重入且需要无状态行为。示例包括在没有用户登录时从任务调度器运行的程序,或从服务器端web应用程序(如ASP.NET)调用的程序,或在COM+服务下运行的分布式组件

但是,如果您打算继续沿着这条路走下去,我建议您摆脱应用程序作为中间人的角色,让
INSERT
直接查询源数据。ACE应支持:


胡乱猜测-如果控制台应用程序只写入Excel文件,但ASP.Net以这样一种模式打开它,Excel中会有重新计算/刷新…@deathApril:在这两种情况下,他们每次都在创建一个新文件。这些文件是相同的。我将更新我的问题,以提及这一点。他们是否使用相同的
COM
方法和相同的参数来创建和写入Excel文件?正如我在问题中提到的,他们实际上使用相同的数据运行相同的代码。代码位于每个项目引用的第三个C#dll中。我感谢您的帮助,但“显然”?不必油嘴滑舌明白你说的会话锁是什么意思,但我不明白这和我的问题有什么关系?我不是在衡量请求的时间,只是衡量创建excel文件本身所需的时间。会话,甚至其他发出请求的人,都不应该在这个问题上露脸,特别是因为我是唯一一个向服务器发出请求的人,而且一次只能有一个请求。@RossiDead set EnableSessionState=false,进行测试,然后我们再次交谈……我奖励你奖金,因为这似乎是最有可能的罪魁祸首
SELECT *
FROM ExternalTable IN '' [ODBC;Driver={SQL Server}; Server=ServerName; Database=DatabaseName; Trusted_Connection=Yes]