ExecuteBatch() 没有更新

ExecuteBatch() is not updating

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

基本上,当我尝试执行批处理时,它不会更新我的数据库。数据库是本地主机,我可以使用相同的 URL 从数据库中读取并且没有任何异常(异常或 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;
    }

尽管 insert() 上有一个 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 ]

为什么它不 update/insert 到我的数据库?

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

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

问题出在我的 URL 连接上。它是:

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

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

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

另外,我很抱歉没有发布 URL。如果我这样做了,也许这早就可以解决了。