• 使用 Mybatis 框架 jdbc 方式批量写入 SQL Server,报错 com.microsoft.sqlserver.jdbc.SQLServerException 传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。此 RPC 请求中提供了过多的参数,最多应为2100



    这个错是sqlserver抛出来的。 进过验证,上述错误中的2100为插入的总字段数。
    比如下面这种插入方式,values后面的一个括号里的字段为30个,那么后面最多只能加70条,即这种批量插入方式一次性最多只能插入70条。

    insert table() values(),(),()....
    

    如果超过71条,就会出现这个错误。这是使用了mybatis这个持久层框架之后sqlserver自身的限制。

    解决办法

    1.批量插入改为循环单条插入,这个不太合适,批量就是为了提高插入效率,这样改只是解决了表面问题,却丢了我们想要达到的目的。
    2.使用JDBC的的方式执行批量插入。这个方法虽然实现麻烦了点,但是解决了这个报错的问题,也达到了我们的目的。
    这里给成第二种解决方式的java代码

     public void insert(List<Person> personList) throws SQLException {
    		final String sql = "INSERT INTO MT_EXP_SUB(NAME,AGE,SEX) VALUES(?,?,?)";
    		Connection conn = null;
    		PreparedStatement ps = null;
    		try {
    			// 获取数据库连接
    			conn = ds.getConnection();
    			if (conn == null) {
    				throw(new RuntimeException("获取数据库连接失败"));
    			}
    			// 预编译SQL
    			ps = conn.prepareStatement(sql);
    			// 关闭自动提交事务
    			conn.setAutoCommit(false);
    			for (Person person : personList) {
    				ps.setString(1, person.getName());
    				ps.setInt(2, person.getAge());
    				ps.setString(3, person.getSex());
    				ps.addBatch();
    			}
    			// 执行批量入库
    			ps.executeBatch();
    			// 手动提交事务
    			conn.commit();
    
    		}catch (Exception e) {
    			// 批量入库异常,回滚
    			conn.rollback();
    		}finally {
    			if(conn != null) {
    				conn.close();
    			}
    			if(ps != null) {
    				ps.close();
    			}
    		}
    	}
    

    参考链接1:https://blog.csdn.net/qq_35457078/article/details/85259789
    参考链接2:https://bbs.csdn.net/topics/391933671

  • 相关阅读:
    线程池原理分析
    强引用-软引用-弱引用
    并发编程之多线程
    linux关于获取时间的几个函数
    gdb安装和使用
    c++四种显式类型转换
    ARP协议
    Vmware 共享文件夹不显示的问题
    gdb基本使用
    动态二维数组实现
  • 原文地址:https://www.cnblogs.com/David-domain/p/11039024.html
Copyright © 2020-2023  润新知