3.2 数据访问 - DBUtils批量方法
金蝶云社区-云小爱
云小爱
2人赞赏了该文章 4,469次浏览 未经作者许可,禁止转载编辑于2014年09月27日 17:53:17

BatchDelete批量删除数据。不适用KSQL语法。注意:批量删除目前只支持标准SQL语法,不支持KSQL语法。复杂应用建议使用Execute执行或者使用方言。批量参数(datatable里的值)如果为空或者空串(生成的sql为 field = null),可能会得到不是所期望的结果。参数:BatchSqlParam 批量执行参数。仅用于单表批量执行,where只支持简单And逻辑,不支持ksql函数。方法:AddWhereExpression 增加where条件表达式,条件之间只支持And逻辑示例:AddWhereExpression("FSTARTYEAR", KDDbType.Int32, "FYEAR");相应的语句为:FYEAR = @FSTARTYEARAddWhereExpression("FSTARTYEAR", KDDbType.Int32, "FYEAR", "T1");相应的语句为:T1.FYEAR = @FSTARTYEAR

[tr][td]C#
[td]


[tr][td=2,1] DataTable dt = new DataTable(); dt.Columns.Add("f1"); DataRow row = dt.NewRow(); row[0] = 102; row[1] = 110; dt.Rows.Add(row);
BatchSqlParam batchParam = new BatchSqlParam("T_BAS_OPERATELOG", dt); //添加where字段集合 batchParam.AddWhereExpression("f1", KDDbType.Int32, "FUSERID"); DBUtils.BatchDelete(ctx, batchParam);

以上代码相当于以下语句:Delete T_BAS_OPERATELOG where FUSERID = @f1

BatchUpdate
批量更新数据。不适用KSQL语法。注意:批量删除目前只支持标准SQL语法,不支持KSQL语法。复杂应用建议使用Execute执行或者使用方言。批量参数(datatable里的值)如果为空或者空串(生成的sql为 field = null),可能会得到不是所期望的结果。

[tr][td]C#
[td]


[tr][td=2,1] DataTable dt = new DataTable(); dt.Columns.Add("f1"); dt.Columns.Add("f2"); DataRow row = dt.NewRow(); row[0] = 102; row[1] = 110; dt.Rows.Add(row);
BatchSqlParam batchParam = new BatchSqlParam("T_BAS_OPERATELOG", dt); //添加set字段集合,KEY必须为dt的columnname batchParam.AddSetExpression("f1", KDDbType.Int32, "FUSERID"); //添加where字段集合,KEY必须为dt的columnname batchParam.AddWhereExpression("f2", KDDbType.Int32, "FUSERID"); //执行update DBUtils.BatchUpdate(ctx, batchParam); //或者带附加条件的更新:batchParam.TableAliases = "t1"; //设置表别名,用于其他where条件表别名DBUtils.BatchUpdate(ctx, batchParam, " t1.fstatus = 'A'");

以上代码相当于以下语句:Update T_BAS_OPERATELOG t1 set FUSERID = @f1 where t1.FUSERID = @f2 and t1.fstatus = ‘A’
批量更新支持表达式,表达式必须使用KSQL语法。例如:
[tr][td=65%]C#
[td]


[tr][td=2,1]DataTable dt = new DataTable();dt.Columns.Add("f1");dt.Columns.Add("f2");DataRow row = dt.NewRow();row[0] = 110;row[1] = 102;dt.Rows.Add(row);BatchSqlParam batchParam = new BatchSqlParam("T_BAS_OPERATELOG", dt);batchParam.TableAliases = "t1";batchParam.AddSetExpression("f1", KDDbType.Int32, "FQty", "TO_INT(FQty) + {0}");//此处仅示例表达式和ksql函数使用batchParam.AddWhereExpression("f2", KDDbType.Int32, "FUSERID");DBUtils.BatchUpdate(ctx, batchParam, " t1.flogonorgid = 1");

以上更新相当于执行:Update T_BAS_OPERATELOG t1 set FQTY = TO_INT(FQTY) + @f1 where t1.FUSERID = @f2

BulkInserts批量插入数据。也可以指定建表语句将数据批量插入到新表中。INSERT语句的字段必须与DataTable匹配。否则执行将报错。注意:InsertstrSql参数已作废,不用设置。适用KSQL语法,若要用sqlserver或oracle语法,请在语句前加/*dialect*/标识("/*dialect*/UPDATE T_DEMO set FValue = 1)。
用法如下:
[tr][td=65%]C#
[td]


[tr][td=2,1]DataTable dt = new DataTable();dt.TableName = "T_TEMP";dt.Columns.Add("FID");foreach (int id in fIds){ dt.LoadDataRow(new int[] { id }, true);}using (KDTransactionScope scope = new KDTransactionScope(System.Transactions.TransactionScopeOption.Suppress)){ //创建临时表并插入数据 DBUtils.BulkInserts(ctx, "", "create table T_TEMP (FID INT)", dt); scope.Complete();}//关联取数IDataReader reader = DBUtils.ExecuteReader(ctx, " SELECT * FROM T_DEMO INNER JOIN T_TEMP ON T_DEMO.FID = T_TEMP.FID ");//删除临时表DeleteTemporaryTable(ctx, "T_TEMP");

ExecuteBatch批量执行SQL。在循环中执行语句效率很低,该方法提供一种在循环外批量执行语句的方法。注:KSQL语法,若要用sqlserver或oracle语法,请在语句前加/*dialect*/标识("/*dialect*/UPDATE T_DEMO set FValue = 1)。

[tr][td=65%]C#
[td]


[tr][td=2,1]List listSql = new List();foreach (FieldValue val in fieldValues){string sql = "UPDATE T_DEMO set FValue = 0 where FID = @FID ";
SqlObject sqlObj = new SqlObject(sql, new Param("@FID", DbType.Int32, id)); listSql.Add(sql);}DBUtils.ExecuteBatch(Context, listSql);

注:此语句完全可以使用BatchUpdate替代。此处仅示例方法的用法。