对于超过一万行的数据更新,如果我们使用平常的循环调用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[] { FENTRYIDW, FTaxPriceW }, 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);
即可实现批量灌入系统。
当然最后一句是星空独有的自带方法,其他系统应该有类似的方法。可以参考。
好了关于大批量更新数据就举例这么多。如有疑问欢迎评论加点赞支持