Skip to content

合并数据

使用MergeIno 语句

  • 适用于场景:无实体类,只要有数据库表即可运行。
  • 个性化程度--高,能够支持各类SQL的复杂条件查询、构建
  • 性能:极高
  • 推荐业务场景:在同一个数据库中,从一个表,把数据写入到另一个表,且无须服务端函数进行干预(如不需要借用服务端函数获取id、流水码等)。
c#
var dt = kit
        .mergeInto("SK_RealInBill", "b")
        .from("r", (r) =>
        {
            r.select("*")
                .from("SK_RealInEFuel a")
                .whereIn("a.STATUS", "A", "AC");
        })
        .on("r.SK_RealInEFuelOID=SK_RealInBill.SK_RealInBillOID")
        .setI("SK_RealInBillOID", "r.SK_RealInEFuelOID", false)
        .setI("Ri_Task", "2")
        .setI("Ri_InSrc", "4")
        .set("Ri_PayAcc", "r.PAY_ACCOUNT", false)
        .set("Ri_PayAccName", "r.PAY_NAME", false)
        .set("Ri_Code", "r.RCPT_NO", false)
        .set("Ri_Num", "r.COST", false)
        .set("Ri_Man", "r.CZRMC", false)
        .set("Ri_InType", "(case when r.STATUS='A' then '1' when r.STATUS='AC' then '2'  else '' end) ", false)
    .doMergeInto();

使用MatchBulk

  • 适用于场景:无实体类,只要有服务端DataTable、目标数据库表即可运行。
  • 个性化程度--极高,能够使用服务端进行各类的条件判定、数据处理
  • 性能:高
  • 适用场景:从一个来源查询获取到DataTable数据后,比对后插入或更新到目标数据库表中。尤其适合于跨库同步数据。
c#
var dt = kit.select("*")
            .from("UCML_RESPONSIBILITY r")
            .query();


var oldDt = kit.clear().select("*").from("HH_SysRole").query();

var mb = new MatchBulk("HH_SysRole", 0);
mb.checkTable = oldDt;
mb.keyCol = "Id";

foreach (DataRow row in dt.Rows)
{
    var code = row["R_Code"].ToString();
    mb.checkExist("Code='" + code + "'");

    var scope = "1";
    mb.add("Id", YitIdHelper.NextId())
        .add("Code", code)
        .add("TenantId", 1300000000001)
        .add("IsDelete", false)
        .add("Status", 1)
        .add("CreateTime", DateTime.Now)
        .set("UpdateTime", DateTime.Now)
        .set("Name", row["RESP_NAME"])
        .set("Remark", row["RESP_DESC_TEXT"])
        .set("OrderNo", row["level"])
        .set("DataScope", scope)
        .end();

}

cc += (int)mb.save();

使用BulkTable进行批量插入

  • 性能:高。在数据库驱动支持时(比如SQLServer),写入性能极高。
  • 依赖:无须实体类,基于DataTable。
  • 适用场景:只需进行新增数据,无须重复判定时。
c#
var mdt = kit.select("*")
            .from("ZH_Portal")
            .where("ZH_PortalOID", moid)
            .query();
var paotalBulk = new BulkTable("ZH_Portal", 0);
paotalBulk.bulkTarget = mdt;
paotalBulk.doInsert();

使用BatchSQL批量提交

  • 性能:中,等同于普通的insert/update语句。
  • 个性化程度:高,可以自由编制SQL。
  • 适用场景:适合需要操作多个数据库表,数据量较小,但一致性要求高,(如事务)。

注意事项

  • newRow后,必须调用addInsert/addUpdate方法,才会真正保存SQL。 否则 newRow方法只会清空当前编织器的信息。

  • batchSQL对象是绑定到某个特定数据库连接位的,不能同时操作多个数据库,如果需要,请分别获取对应的实例。这一点与大多数 mooSQL的操作类统一。

核心方法

var kit= bkit.newRow() ---初始化一个新的SQLBuilder类并返回

利用返回的 kit 创建一个SQL的插入或更新

bkit.addInsert()/addUpdate() --- 其实质是bkit自动去调用了 kit.toInsert()/toUpdate()方法并将SQL存储起来。

bkit.exeNonQuery() ----执行保存起来的所有SQL

c#
var bkit = DBCash.newBatchSQL(0);
foreach (DataRow track in trackDt.Rows) {
    var dangOID = track["ZH_Danger_FK"].ToString();
    var progs = progDt.Select(string.Format("ZH_Danger_FK='{0}'", dangOID));
    if(progs.Length > 0)
    {
        var st = progs[0]["FP_MarkState"];
        bkit.newRow()
            .setTable("ZH_DangTrack")
            .set("DT_ProgMarking", st)
            .where("ZH_DangTrackOID", track["ZH_DangTrackOID"]);
        bkit.addUpdate();
    }
}
cc=bkit.exeNonQuery();