如何提高 dataadapter.fill 的性能?
Posted
技术标签:
【中文标题】如何提高 dataadapter.fill 的性能?【英文标题】:How can I improve performance of dataadapter.fill? 【发布时间】:2020-04-28 23:12:03 【问题描述】:我正在使用 SqlDataAdapter.fill 将数据存储在 DataTable 中。然后将该表作为 JSON 返回。
在客户端应用程序 (Excel) 中获取该 JSon 时,它变得非常慢。
知道如何提高性能吗?
API 代码:
[Authorize]
[Route("GetRecord")]
public DataTable Records(DSModel model)
var table = new DataTable();
using (var da = new SqlDataAdapter(model.qstring, model.ds))
da.Fill(table);
return table;
客户代码:
DataTable dt = (DataTable)JsonConvert.DeserializeObject(records, (typeof(DataTable)));
foreach (DataRow dr in dt.Rows)
rowcount += 1;
for (int i = 1; i <= dt.Columns.Count; i++)
// on the first iteration we add the column headers
if (rowcount == 3)
osheet.Cells[2, i] = dt.Columns[i - 1].ColumnName;
// Filling the excel file
osheet.Cells[rowcount, i] = dr[i - 1].ToString();
为了比较,如果我使用 SQL Connection 从 Excel 中查询相同的数据,则需要 2-3 秒。使用上面的代码,一个特定的表几乎需要 11-14 秒。
【问题讨论】:
Excel 互操作非常慢,无法改进。您可以使用oledb写入excel或使用更快的Entity。 @jdweng 这是否意味着我获取数据的方式是最佳的。?我的意思是方法..like sql > datatable > json in api code 然后从 json > datatable 然后填充 excel。?您看到这里有什么改进吗? Interop 使用专有脚本语言在 c# 和 excel 之间进行通信。该脚本在编译 c# 时生成,但 excel 并解析结果并将相同格式的数据返回给 c#。读取或写入时互操作很慢。互操作是从 c# 格式化 excel 工作簿的唯一方法。因此,如果您不需要格式化,最好使用其他方法。 你应该尝试一次设置一个完整的行,而不是每个单元格 哪部分慢?da.Fill(table);
在服务器端?调用服务器并将结果作为字符串下载到客户端(代码未显示)? JsonConvert.DeserializeObject(records, (typeof(DataTable)))
在客户端?还是客户端的foreach (DataRow dr in dt.Rows) ...
Excel 互操作循环?您的问题标题暗示 da.Fill(table);
是慢的,但是您检查了吗?
【参考方案1】:
客户端可以创建到sql server的连接吗?如果是这样,您可以将查询结果写入表并将数据库和表名返回给客户端。然后客户端可以将表格加载到 Excel 中。
更多信息见帖子:Fastest way to load data from SQL Server to Excel
【讨论】:
以上是关于如何提高 dataadapter.fill 的性能?的主要内容,如果未能解决你的问题,请参考以下文章
使用 C# dataAdapter.Fill() 和 dataAdapter.Update() 将表的数据从一个数据库传输到另一个数据库的同一个表