星空关于大批量数据更新小招原创
金蝶云社区-BobbyLIU
BobbyLIU
9人赞赏了该文章 1274次浏览 未经作者许可,禁止转载编辑于2022年04月27日 13:50:22

对于超过一万行的数据更新,如果我们使用平常的循环调用update语句更新,性能问题会令人堪忧,有时甚至会引起系统超时,系统崩溃等一系列情况。

这个时候我们就要考虑性能强化了

性能强化,首先得抓住需要强化的主要消耗新能点,调试的过程中就可以看出每段的耗时,如果无法看出,可以使用

Stopwatch sw = new Stopwatch();
sw.Start();
/*代码执行过程*/
sw.Stop();
方法来计算每段代码耗时

在确定主要耗时来源后就可以开始着手优化

这里主要是讲update循环更新的替代优化,上面多啰嗦了几句

我这里的主要思想是—数据灌入

何为数据灌入,即如果要更新的数据比较多,我们需要循环很多次,这时可以用如下代码:

DataTable dt = new DataTable();

dt.TableName = "JD_t_Cust_Entry100001";

var FENTRYID = dt.Columns.Add("FENTRYID");

FENTRYID.DataType = typeof(long);

var FTaxPrice = CGTLdt.Columns.Add("FTaxPrice");

FTaxPrice.DataType = typeof(decimal);

....

// 灌入测试数据

dt.BeginLoadData();

 foreach (DynamicObject queryResult in queryResultDatas)

{

    long FENTRYIDW=001;

    Decimal FTaxPriceW =0.033;

     dt.LoadDataRow(new object[] { FENTRYIDWFTaxPriceW }, true);

}

dt.EndLoadData();// 灌入数据结束

上面这段代码只是示例,意思是把数据先整理,灌入到dt中

这只是第一步

接下来我们执行下面的语句

BatchSqlParam batchUpdateParam = new BatchSqlParam(tableName, dt);   

batchUpdateParam.AddWhereExpression("FENTRYID", KDDbType.Int64, "FENTRYID"); 

batchUpdateParam.AddSetExpression("FTaxPrice", KDDbType.String, "FTaxPrice");

Kingdee.BOS.App.Data.DBUtils.BatchUpdate(ctx, batchUpdateParam);     

即可实现批量灌入系统。

当然最后一句是星空独有的自带方法,其他系统应该有类似的方法。可以参考。


好了关于大批量更新数据就举例这么多。如有疑问欢迎评论加点赞支持




赞 9