改变OleDb的表现?

ros*_*ead 6 c# asp.net oledb excel

我目前正在尝试使用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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ari*_*tos 0

在您评论这是从 aspx 页面上的按钮处理程序调用后,我认为额外的延迟来自会话锁定。

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

为了避免此会话锁定,只需通过设置在页面声明上禁用EnableSessionState="false"

另请参阅

调用aspx页面随机返回图像慢

完全替换 ASP.Net 的会话