zoukankan      html  css  js  c++  java
  • 使用 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

  • 相关阅读:
    CentOS(RedHat) 6.2 Samba share权限拒绝访问
    Android NDK调试C++源码(转)
    linux du命令: 显示文件、目录大小
    网络游戏的同步
    游戏开发辅助库
    Unity3D 200个插件免费分享
    C#UDP同步实例
    C#UDP(接收和发送源码)源码完整
    C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)
    内置函数及匿名函数
  • 原文地址:https://www.cnblogs.com/David-domain/p/11039024.html
Copyright © 2011-2022 走看看