gpt4 book ai didi

c# - 改变 OleDb 性能?

转载 作者:太空狗 更新时间:2023-10-29 21:51:32 25 4
gpt4 key购买 nike

我目前正在尝试使用 OleDb/JET 将 SQL Server 数据导出到 Excel 2003 文件。我最初在控制台应用程序中编写导出代码,它运行得足够快。但是,在 ASP.Net 请求期间运行相同的代码大约需要三倍的时间。具体来说,它在调用 OleDbCommand.ExecuteQuery 期间变慢了,这会将记录插入到 Excel 文件中。

两者之间的唯一区别实际上是一个在控制台应用程序中运行,另一个在 IIS 中运行。除此之外,这两个应用程序都是:

  • 在我的开发机器上运行
  • 从两个应用程序引用的共享 dll 运行与下面相同的代码
  • 使用相同的连接字符串连接到相同的数据库
  • 使用具有完全相同的参数值的完全相同的选择语句
  • 在我的开发机器上的相同位置创建一个全新的文件并写入它
  • 逐字节生成相同的文件

在 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();
}
}
}
}

最佳答案

听起来你需要 a profiler .

可能值得注意的是 Microsoft tell you not to use ACE in ASP .NET .也许他们知道一些未记录在案的实现?

The Access Database Engine 2010 Redistributable is not intended ... (to) be used by a system service or server-side program where the code will run under a system account, or will deal with multiple users identities concurrently, or is highly reentrant and expects stateless behavior. Examples would include a program that is run from task scheduler when no user is logged in, or a program called from server-side web application such as ASP.NET, or a distributed component running under COM+ services.

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

SELECT *
FROM ExternalTable IN '' [ODBC;Driver={SQL Server}; Server=ServerName; Database=DatabaseName; Trusted_Connection=Yes]

关于c# - 改变 OleDb 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9641821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com