当前位置: 首页 > ds >正文

传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100。

### Error updating database.  Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数。最多应为 2100。

这是因为集合数据量过大,需要对集合进行拆分操作,就是将大集合折分成几个小集合,再进行分批操作,如:[1,2,3,4,5,6,7] 按三个一组拆分成 [[1,2,3]、[4,5,6]、[7]]

// 批量增加受理样品@Overridepublic void addBatch(List<ApplySample> applySampleList) {// 如果样品过多,SQL语句的参数大于2100,会报错【此 RPC 请求中提供了过多的参数。最多应为 2100】// applySampleMapper.insertBatch(applySampleList);/*这是插入一条样品信息的SQL语句,用到参数29个,2100 / 29 = 72.4,所以单次最多插入72条样品信息,最好插入50条样品信息<!--批量增加受理样品--><insert id="insertBatch"><foreach collection="list" item="item">if not exists(select as_ID from ApplySampleInfoC where as_OuterApplyId = #{item.outerApplyId} and as_ApplyID = #{item.applyId} and as_SampleNo = #{item.sampleNo})insert into ApplySampleInfoC(as_OuterApplyID, as_ApplyID, as_SampleNo,as_SampleName, as_SampleType, as_YCDD, as_SCDW,as_SCDWDZ, as_BatchNo, as_TradeMark, as_Packing,as_Property, as_Specs, as_CheckCondition, as_Amount, as_Unit,as_Gerder, as_Age, as_SJRQ, as_Vocation,as_nationality, as_Ethnics, as_Marriage, as_Education,as_IdentityCard, as_Telephone, as_Address,as_IdentityAddress, as_TakeMedicineSolutions)values(#{item.outerApplyId}, #{item.applyId}, #{item.sampleNo},#{item.sampleName}, #{item.sampleType}, #{item.location}, #{item.scdwName},#{item.scdwAddress}, #{item.batchNo}, #{item.trademark}, #{item.packing},#{item.property}, #{item.specs}, #{item.condition}, #{item.amount}, #{item.unit},#{item.gender}, #{item.age}, #{item.peopleGroup}, #{item.vocation},#{item.nationality}, #{item.ethnics}, #{item.marriage}, #{item.education},#{item.identityNumber}, #{item.telephone}, #{item.residenceAddress},#{item.identityAddress}, #{item.previousMedicalHistory})</foreach></insert>*/// 批处理,拆分数据,满50条,执行批量插入if (applySampleList != null && applySampleList.size() > 50) {List<ApplySample> applySampleNewList = new ArrayList<>();// 遍历提取数据for (int i = 0; i < applySampleList.size(); i++) {applySampleNewList.add(applySampleList.get(i));// 满50条数据,提交一次if ((i + 1) % 50 == 0) {applySampleMapper.insertBatch(applySampleNewList);applySampleNewList.clear();}}// 最后一次提交if (!applySampleNewList.isEmpty()) {applySampleMapper.insertBatch(applySampleNewList);applySampleNewList.clear();}} else{ // 不够50条数据,不需要分批,直接插入// 列表有数据才进行插入,否则不执行任何操作。这样写代码才健壮if (applySampleList != null && !applySampleList.isEmpty()) {applySampleMapper.insertBatch(applySampleList);}}}

对上面代码进行优化:

// 批量增加受理样品@Overridepublic void addBatch(List<ApplySample> applySampleList) {// 如果样品过多,SQL语句的参数大于2100,会报错【此 RPC 请求中提供了过多的参数。最多应为 2100】// applySampleMapper.insertBatch(applySampleList);/*这是插入一条样品信息的SQL语句,用到参数29个,2100 / 29 = 72.4,所以单次最多插入72条样品信息,最好插入50条样品信息<!--批量增加受理样品--><insert id="insertBatch"><foreach collection="list" item="item">if not exists(select as_ID from ApplySampleInfoC where as_OuterApplyId = #{item.outerApplyId} and as_ApplyID = #{item.applyId} and as_SampleNo = #{item.sampleNo})insert into ApplySampleInfoC(as_OuterApplyID, as_ApplyID, as_SampleNo,as_SampleName, as_SampleType, as_YCDD, as_SCDW,as_SCDWDZ, as_BatchNo, as_TradeMark, as_Packing,as_Property, as_Specs, as_CheckCondition, as_Amount, as_Unit,as_Gerder, as_Age, as_SJRQ, as_Vocation,as_nationality, as_Ethnics, as_Marriage, as_Education,as_IdentityCard, as_Telephone, as_Address,as_IdentityAddress, as_TakeMedicineSolutions)values(#{item.outerApplyId}, #{item.applyId}, #{item.sampleNo},#{item.sampleName}, #{item.sampleType}, #{item.location}, #{item.scdwName},#{item.scdwAddress}, #{item.batchNo}, #{item.trademark}, #{item.packing},#{item.property}, #{item.specs}, #{item.condition}, #{item.amount}, #{item.unit},#{item.gender}, #{item.age}, #{item.peopleGroup}, #{item.vocation},#{item.nationality}, #{item.ethnics}, #{item.marriage}, #{item.education},#{item.identityNumber}, #{item.telephone}, #{item.residenceAddress},#{item.identityAddress}, #{item.previousMedicalHistory})</foreach></insert>*/// 集合不为空if (!applySampleList.isEmpty()) {// 批处理,拆分数据,满50条,执行批量插入List<List<ApplySample>> lists = splitList(applySampleList, 50);for (List<ApplySample> list: lists) {applySampleMapper.insertBatch(list);}}// 集合分割,将一个大集合分割成多个小集合,数据示例:[1,2,3,4,5,6,7] 按3个元素一组分割成 [[1,2,3],[4,5,6],[7]]public List<List<ApplySample>> splitList(List<ApplySample> list, int chunkSize) {List<List<ApplySample>> result = new ArrayList<>();for (int i = 0; i < list.size(); i += chunkSize) {int end = Math.min(i + chunkSize, list.size());result.add(list.subList(i, end));}return result;}}

对上面代码再一步优化:

1、提取集合拆分的逻辑,做成集合拆分通用工具

package com.weiyu.utils;import java.util.ArrayList;
import java.util.Collection;
import java.util.List;public class PublicUtils {/*** 集合分割,将一个大集合分割成多个小集合,数据示例:[1,2,3,4,5,6,7] 按3个元素一组分割成 [[1,2,3],[4,5,6],[7]]* @param list 集合* @param chunkSize 分割大小* @return 返回分割集合*/public static <E> Collection<List<E>> splitList(List<E> list, int chunkSize) {List<List<E>> result = new ArrayList<>();for (int i = 0; i < list.size(); i += chunkSize) {int end = Math.min(i + chunkSize, list.size());result.add(list.subList(i, end));}return result;}
}

2、使用集合拆分通用工具

// 批量增加受理样品@Overridepublic void addBatch(List<ApplySample> applySampleList) {// 如果样品过多,SQL语句的参数大于2100,会报错【此 RPC 请求中提供了过多的参数。最多应为 2100】// applySampleMapper.insertBatch(applySampleList);/*这是插入一条样品信息的SQL语句,用到参数29个,2100 / 29 = 72.4,所以单次最多插入72条样品信息,最好插入50条样品信息<!--批量增加受理样品--><insert id="insertBatch"><foreach collection="list" item="item">if not exists(select as_ID from ApplySampleInfoC where as_OuterApplyId = #{item.outerApplyId} and as_ApplyID = #{item.applyId} and as_SampleNo = #{item.sampleNo})insert into ApplySampleInfoC(as_OuterApplyID, as_ApplyID, as_SampleNo,as_SampleName, as_SampleType, as_YCDD, as_SCDW,as_SCDWDZ, as_BatchNo, as_TradeMark, as_Packing,as_Property, as_Specs, as_CheckCondition, as_Amount, as_Unit,as_Gerder, as_Age, as_SJRQ, as_Vocation,as_nationality, as_Ethnics, as_Marriage, as_Education,as_IdentityCard, as_Telephone, as_Address,as_IdentityAddress, as_TakeMedicineSolutions)values(#{item.outerApplyId}, #{item.applyId}, #{item.sampleNo},#{item.sampleName}, #{item.sampleType}, #{item.location}, #{item.scdwName},#{item.scdwAddress}, #{item.batchNo}, #{item.trademark}, #{item.packing},#{item.property}, #{item.specs}, #{item.condition}, #{item.amount}, #{item.unit},#{item.gender}, #{item.age}, #{item.peopleGroup}, #{item.vocation},#{item.nationality}, #{item.ethnics}, #{item.marriage}, #{item.education},#{item.identityNumber}, #{item.telephone}, #{item.residenceAddress},#{item.identityAddress}, #{item.previousMedicalHistory})</foreach></insert>*/// 集合不为空if (!applySampleList.isEmpty()) {// 批处理,拆分数据,满50条,执行批量插入List<List<ApplySample>> lists = (List<List<ApplySample>>)PublicUtils.splitList(applySampleList, 50);for (List<ApplySample> list: lists) {applySampleMapper.insertBatch(list);}}}

http://www.xdnf.cn/news/1057.html

相关文章:

  • 常用第三方库:dio网络库使用与封装
  • PHP 爬虫如何获取 1688 商品详情(代码示例)
  • 【前端记事】关于electron的入门使用
  • 【C++】vector<bool>特化
  • 外商在国内宣传 活动|发布会|参展 邀请媒体
  • 软件测试之接口测试常见面试
  • 什么是负载均衡?NGINX是如何实现负载均衡的?
  • UML 通信图对象协作:共享汽车系统交互脉络
  • 为什么在TCP层(即传输层)没有解决半包、粘包的问题
  • 技术速递|Agent 模式:对所有用户开放,并支持 MCP
  • 【SF顺丰】顺丰开放平台API对接(注册、API测试篇)
  • V5验证官网滑块验证码WSS协议逆向算法分析
  • vue vite开发时保留console.log打包完后依然想保留某个文件夹下的console.log方便以后的观察
  • C语言实现堆(优先队列)详解
  • 【Easylive】手动实现分布式事务解决方案流程解析
  • Java转Go日记(四):socket编程
  • STM32之DHT11温湿度传感器---附代码
  • vue3性能优化
  • 【数据结构_12】优先级队列
  • 深度学习3.5 图像分类数据集
  • YOLO11改进 | 特征融合Neck篇之Lowlevel Feature Alignment机制:多尺度检测的革新性突破
  • C 语言开发问题:使用 <assert.h> 时,定义的 #define NDEBUG 不生效
  • vin码识别技术-车辆vin识别代码-Java接口集成
  • 《理解C++宏:从#define到条件编译》
  • 【工具】VS Code/Cursor 编辑器状态栏颜色自定义指南
  • 装饰模式:动态扩展对象功能的优雅设计
  • AI Agent开发第35课-揭秘RAG系统的致命漏洞与防御策略
  • 极刻AI搜v1.0 问一次问题 AI工具一起答
  • 城市客运安全员证适用岗位及要求
  • QtCreator的设计器、预览功能能看到程序图标,编译运行后图标消失