所以我试图在一次更新中插入多行。在做了一些谷歌搜索后,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
答案 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;";
我也很抱歉没有发布网址。如果我这样做,可能会在不久前修复。