如何提高 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 的性能?的主要内容,如果未能解决你的问题,请参考以下文章

DataAdapter.Fill(数据集)

向 dataAdapter.fill() 添加参数

DataAdapter.Fill()分页

使用 C# dataAdapter.Fill() 和 dataAdapter.Update() 将表的数据从一个数据库传输到另一个数据库的同一个表

在不使用 DataAdapter.Fill 的情况下更新数据表 2 次

DataAdapter.Fill 给出错误“在 sys.servers 中找不到服务器‘系统’。” [关闭]