ERRO! addBatch() e executeBatch() realizando somente o ultimo insert

4 respostas
P

tava tentando fazer um grupo de INSERT numa tabela e para isso ‘agrupava’ os INSERT como o addBath() para depois executar todos de uma vez na tabela com o executeBatch(), mas sei la pq somente o ultimo insert de cada grupo esta sendo feito, sera q ta faltando alguma coisa ou to fazendo besteira?

Obrigado

for(int contArquivos = 0; contArquivos < 5; contArquivos++){
				//LE LINHA POR LINHA DE CADA ARQUIVO
				while((line = reader.readLine()) != null){

					switch(contArquivos){
						case 0: //PAS
							pstmt1 = conbd.prepareStatement("INSERT INTO " + nome_tabelas[contArquivos] + camposInsert + " VALUES (?,?,?,?,?,?,?,?,?)");
							
							pstmt1.setString(1, valor2);
							pstmt1.setInt(2, Integer.parseInt(valor1));
							pstmt1.setInt(3, Integer.parseInt(valor3));
							pstmt1.setInt(4, Integer.parseInt(valor4));
							pstmt1.setFloat(5, Float.parseFloat(valor5));
							pstmt1.setInt(6, Integer.parseInt(valor6));
							pstmt1.setFloat(7, Float.parseFloat(valor7));
							pstmt1.setFloat(8, Float.parseFloat(valor8));
							pstmt1.setInt(9, Integer.parseInt(valor9));
							
							pstmt1.addBatch();		
							break;
							
						case 4: //EQP
							pstmt1 = conbd.prepareStatement("INSERT INTO " + nome_tabelas[contArquivos] + camposInsert + " VALUES (?,?,?,?,?,?)");
							
							pstmt1.setString(1, valor2); 
							pstmt1.setInt(2, Integer.parseInt(valor1));
							pstmt1.setInt(3, Integer.parseInt(valor3)); 
							pstmt1.setInt(4, Integer.parseInt(valor4));
							pstmt1.setInt(5, Integer.parseInt(valor5));
							pstmt1.setString(6, valor6); //lado
							
							pstmt1.addBatch();
							break;
							
						default: //PDS, LIA, MUL
							pstmt1 = conbd.prepareStatement("INSERT INTO " + nome_tabelas[contArquivos] + camposInsert + " VALUES (?,?,?,?)");
							
							pstmt1.setString(1, valor2); 
							pstmt1.setInt(2, Integer.parseInt(valor1)); 
							pstmt1.setInt(3, Integer.parseInt(valor3)); 
							pstmt1.setInt(4, Integer.parseInt(valor4)); 
							
							pstmt1.addBatch();
							break;
					}
					
				}//fim do while que percorre as linhas de um arquivo
				
				
				//executar DELETE entre dataInicio e dataFim, antes de executar INSERT
				if(verificaPrimeiroRegistro > 1){
					pstmt2 = conbd.prepareStatement("DELETE FROM "
							+ nome_tabelas[contArquivos] + " WHERE (" + bh_dthr
							+ " >= '" + dataInicioBuraco + "' AND " + bh_dthr + " <= '"
							+ dataFimBuraco + "')");
					pstmt2.executeUpdate();
				}else{
					pstmt2 = conbd.prepareStatement("DELETE FROM "
							+ nome_tabelas[contArquivos] + " WHERE " + bh_dthr
							+ " = '" + dataInicioBuraco + "'");
					pstmt2.executeUpdate();
				}
				System.out.println("Deletado o intervalo na tabela");
				
				pstmt1.executeBatch();

			}//fim do for que percorre os 5 arquivos

4 Respostas

V

O addBatch() não pede parametro ??

http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Statement.html#addBatch(java.lang.String)

algo como :

statement = con.createStatement();
statement.addBatch("SQL1");
statement.addBatch("SQL2");

statement.executeBatch();

:lol:

P

mas a interface preparedStatement q é q eu to usando pstmt1 tem uma implementação de addBatch() sem parametros…

Y

Até está certo o addBatch sem parâmetros. O problema é a cada loop você faz uma nova chamada ao PreparedStatement, logo, um novo Statement é criado para a conexão e o batch é apagado.

O que ocorre é que você não pode usar diferentes PreparedStatement’s para um mesmo batch. O batch deve ser constituído ou de instruções prontas (ou seja, String’s literais) ou por uma mesma instrução num mesmo PreparedStatement que apenas altera os parâmetros.

As maneiras possíveis seriam:

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO table (Name, Age) VALUES (?, ?);");

int i =0;

while (i < 5)
  {
   pstmt.setString(1, dataName[i]);
   pstmt.setInt(2, dataAge[i]);
   pstmt.addBatch(); /* adiciona uma nova instrução ao batch. Em cada loop mudam os parâmetros, mas permanece o mesmo PreparedStatement e, portanto, a mesma instrução */
   i++;
  }

// outra forma:
Statement stmt = conn.createStatement();

int i =0;

while (i < 5)
  {
   stmt.addBatch("INSERT INTO table (Name, Age) VALUES (" + dataName[i] + ", " + dataAge[i] + ");");
   /* dessa forma, pode ser usada qualquer instrução, entretanto, o Statement tem de permanecer mesmo, caso contrário o batch será apagado */
   i++;
  }

Conclusão: da maneira que você está fazendo não vai dar certo.

P

isso explica pq so o ultimo insert era realizado… obrigado problema solucionado!

Criado 9 de janeiro de 2008
Ultima resposta 11 de jan. de 2008
Respostas 4
Participantes 3