知识分享 - 批量更新数据库
金蝶云社区-JohnnyDing
JohnnyDing
13人赞赏了该文章 5,633次浏览 未经作者许可,禁止转载编辑于2016年08月12日 15:54:11

需求背景

在内存中,整理了一大批数据,需要更新到数据库。
采用逐条数据更新的话,会非常慢。

K/3 Cloud 提供了批量插入、批量更新、批量删除物理表格数据的服务。
本帖通过示例代码,演示如何准备参数,调用这些服务。

示例代码
//***************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.ComponentModel;

using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.ServiceHelper;

namespace JDSample.FormPlugIn.CallService
{
[Description("批量更新数据")]
public class S160812BulkInsertsEdit : AbstractDynamicFormPlugIn
{
public override void BarItemClick(BarItemClickEventArgs e)
{
if (e.BarItemKey.EqualsIgnoreCase("tbBulkInserts"))
{
this.BulkInserts();
}
if (e.BarItemKey.EqualsIgnoreCase("tbBatchUpdate"))
{
this.BatchUpdate();
}
if (e.BarItemKey.EqualsIgnoreCase("tbBatchDelete"))
{
this.BatchDelete();
}
}

///


/// 批量插入数据
///

private void BulkInserts()
{
// 定义一个DataTable,存储待插入的数据。表名、列名需要与物理表格一致(字段名大小写敏感
DataTable dt = new DataTable();
dt.TableName = "JD_t_Cust_Entry100001";
var idCol = dt.Columns.Add("FID");
idCol.DataType = typeof(long);

// 灌入测试数据
dt.BeginLoadData(); // 执行此方法,可以提升灌入数据性能
for (int i = 1; i <= 10; i++)
{
dt.LoadDataRow(new object[] { i }, true);
}
dt.EndLoadData(); // 灌入数据结束

// 批量插入到数据库
DBServiceHelper.BulkInserts(this.Context, string.Empty, string.Empty, dt);
}

///


/// 批量更新数据
///

private void BatchUpdate()
{
// 定义一个DataTable:存储待更新的数据
DataTable dt = new DataTable();
dt.TableName = "JD_t_Cust_Entry100001";
var idCol = dt.Columns.Add("FID");
idCol.DataType = typeof(long);
var billNoCol = dt.Columns.Add("FBillNo");
billNoCol.DataType = typeof(string);

// 灌入测试数据
dt.BeginLoadData(); // 执行此方法,可以提升灌入数据性能
for (int i = 1; i <= 10; i++)
{
dt.LoadDataRow(new object[] { i, i.ToString() }, true);
}
dt.EndLoadData(); // 灌入数据结束

// 准备批量更新服务参数
// tableName : 待更新的物理表格名
// dt : 待更新的数据
BatchSqlParam batchUpdateParam = new BatchSqlParam("JD_t_Cust_Entry100001", dt);

// 设置匹配字段:即DataTable中的数据,与物理表格以那个字段进行匹配
// 匹配字段可以添加多个
// columnName: DataTable中的列名
// fieldName : 物料表格中匹配的字段名
batchUpdateParam.AddWhereExpression("FID", KDDbType.Int64, "FID");

// 设置待更新的字段
// columnName: DataTable中的列名
// fieldName : 对应的物料表格字段名
batchUpdateParam.AddSetExpression("FBillNo", KDDbType.String, "FBillNo");

// 执行批量更新
Kingdee.BOS.App.Data.DBUtils.BatchUpdate(this.Context, batchUpdateParam);
}

///


/// 批量删除数据
///

private void BatchDelete()
{
// 定义一个DataTable:存储待删除的数据
DataTable dt = new DataTable();
dt.TableName = "JD_t_Cust_Entry100001";
var idCol = dt.Columns.Add("FID");
idCol.DataType = typeof(long);
var billNoCol = dt.Columns.Add("FBillNo");
billNoCol.DataType = typeof(string);

// 灌入测试数据
dt.BeginLoadData(); // 执行此方法,可以提升灌入数据性能
for (int i = 1; i <= 10; i++)
{
dt.LoadDataRow(new object[] { i, i.ToString() }, true);
}
dt.EndLoadData(); // 灌入数据结束

// 准备批量删除服务参数
// tableName : 待删除数据的物理表格名
// dt : 待删除的数据
BatchSqlParam batchDeleteParam = new BatchSqlParam("JD_t_Cust_Entry100001", dt);

// 设置匹配字段:即DataTable中的数据,与物理表格以那个字段进行匹配
// 匹配字段可以添加多个
// columnName: DataTable中的列名
// fieldName : 物料表格中匹配的字段名
batchDeleteParam.AddWhereExpression("FID", KDDbType.Int64, "FID");

// 执行批量删除
Kingdee.BOS.App.Data.DBUtils.BatchDelete(this.Context, batchDeleteParam);

}
}
}