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。如果我这样做了,也许这早就可以解决了。
所以我试图在一次更新中插入多行。经过谷歌搜索后,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。如果我这样做了,也许这早就可以解决了。