ExecuteBatch()没有更新

时间:2017-10-23 23:19:18

标签: java sql-server jdbc nodes batch-insert

所以我试图在一次更新中插入多行。在做了一些谷歌搜索后,rewriteBatch是大多数人建议的那个。

基本上,当我尝试执行批处理时,它不会更新我的数据库。 db是localhost,我可以使用相同的URL从db读取,并且没有任何异常(Exception或SQLException)。

public void insert(Node[] nodes) {  
    try { 
        conn = (Connection) DriverManager.getConnection(url);
        System.out.println(conn.getMetaData().supportsBatchUpdates());
        conn.setAutoCommit(false);
        for (int i = 0; i < nodes.length; i++) {
            if(nodes[i].next!=null){
       pstmt=conn.prepareStatement(StatementUtils.createInsertStatement(i));
                addToBatch(nodes[i].next);
                int [] res=pstmt.executeBatch();
                System.out.print("has "+res.length+" elements. Status:[");
                for (int j = 0; j < res.length; j++) {
                    System.out.print(res[j]+" ");
                }
                System.out.println("]");
                conn.commit();
                pstmt.close();
            }
        }
    }
    catch(Exception e){
        try {
            conn.rollback();
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }
    finally { 
        if (conn != null) {
        try { conn.close(); }
        catch (SQLException e) {
            printSQLException(e); 
            } 
        }
    }
}

private void addToBatch(Node n) throws SQLException{
    if(n!=null){
        pstmt.setString(1, n.can.getCar());
        pstmt.setInt(2, n.can.getID());
        pstmt.setTimestamp(3, n.can.getDate());
        pstmt.setInt(4, n.can.getLength());
        for (int i = 1; i <= n.can.getLength(); i++) {
            pstmt.setInt(i+4, n.can.getData(i-1));
        }
        pstmt.addBatch();
        addToBatch(n.next);
    }
}

public static String createInsertStatement(int length){
        String s="INSERT into CanData (carName,systemID,dataDate,size";
        for (int i = 0; i < length; i++) 
                s+=",d"+i;
        s+= ")values(?,?,?,?";
        for (int i = 0; i <length; i++)
                s+=",?";
        s+=")";
        return s;
    }

即使插入()上有for,但为了测试的目的,现在节点数组只有1个位置。

这也是我的输出:

true
has 18 elements. Status:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ]
true
has 14 elements. Status:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 ]
true
has 15 elements. Status:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ]
true
has 18 elements. Status:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ]
true
has 14 elements. Status:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 ]
true
has 11 elements. Status:[1 1 1 1 1 1 1 1 1 1 1 ]

为什么不更新/插入我的数据库?

顺便说一下,如果你读到这里,谢谢你的耐心xD

1 个答案:

答案 0 :(得分:1)

首先感谢所有试图帮助我并花时间搜索并试图回答我问题的人。

问题是我的网址连接。那是:

url="jdbc:sqlserver://localhost;rewriteBatchUpdates=true;instanceName=MSSQLSERVER;integratedSecurity=true;";

但是缺少数据库名称和端口号。当您尝试在同一时间插入多行时,您需要定义数据库和端口号,如下所示:

url = "jdbc:sqlserver://localhost:1433;database=IFS_DB;rewriteBatchUpdates=true;instanceName=MSSQLSERVER;integratedSecurity=true;";

我也很抱歉没有发布网址。如果我这样做,可能会在不久前修复。