Estou uma dificuldade em gravar o resultado de um query executada em um arquivo txt. Minha query fica num arquivo xml. Até aí consegui ler o xml e guardar essa query em um objeto. Quando passo pro meu ResultSet, não consigo fazer a gravação desses dados buscados pela query no arquivo txt. O meu programa pode executar querys diferentes, não sabendo quais colunas ele irá trazer. Tudo isso depende da query que o caboclo me passou pra configurar no xml.
Usei o getRow() do ResultSet mas só imprimiu a quantidade de linhas lidas na tabela.
Meu método ta assim:
publicvoidexecutarQuery()throwsFileNotFoundException{BufferedWritercctoWriter=null;ResultSetrs=null;PreparedStatementpstmt=null;try{//List<IndicadorBean> indicadores = new ArrayList<IndicadorBean>();MonitorXmlReaderxmlReader=newMonitorXmlReader();IndicadorBeanindicador=xmlReader.parseXmlToObj();StringpSql=indicador.getSql();FilecctoFile=newFile("output/report."+indicador.getNomeArquivoSaida()+".txt");pstmt=this.connection.prepareStatement(pSql);rs=pstmt.executeQuery();while(rs.next()){cctoWriter=newBufferedWriter(newFileWriter(cctoFile));cctoWriter.write(rs.);//O problema é saber que faço aqui.cctoWriter.flush();continue;}}catch(Exceptione){e.printStackTrace();}finally{try{if(cctoWriter!=null)cctoWriter.close();}catch(Exceptione){}try{if(rs!=null)rs.close();}catch(Exceptione){}try{if(pstmt!=null)pstmt.close();}catch(Exceptione){}try{if(this.connection!=null)this.connection.close();}catch(Exceptione){}}}
Ele imprime no console todas as linhas tranquilo mas quando tento escrever num arquivo txt, só escreve a última linha.
O único problema do código acima é que a query pode mudar, ou seja, buscando dados de outra tabela e a quantidade de colunas ser diferente. Sendo assim, para uma query que está buscando dados de uma tabela que possui 7 colunas e mudar a query para buscar dados de uma tabela que tenha 5 colunas, dará erro no sistema de nullPointerException pois não existirá a coluna. Estou tentando arrumar um jeito de fazer mas ainda estou com dificuldade.
Obs: lineNumber é apenas um contador de linhas…
Quem puder ajudar, ficarei grato.
D
drigo.angelo
Utilize o ResultsetMetaData xD
T
tiagofla
Ok. To tentando usar esse ResultSetMetaData. Nunca fiz nada com ele. To vendo como posso adaptá-lo ao código que mencionei na 1ª msg.
T
tiagofla
Fiz aqui mas não ta imprimindo no console corretamente.
Fiz o método aqui mas só tem um problema…quando escreve o resultado da query em um arquivo (xls ou csv ou txt), só escreve a última linha. No console imprime correto, com todas as linhas executadas pela consulta. Estou tentando encontrar qual pode ser o erro mas não estou achando. Quem puder me ajudar, ficarei grato. Segue método:
Alguém teria alguma idéia de onde possa estar a falha, de no momento de eu gravar os dados da consulta numa planilha, só estar gravando a última linha da consulta? No caso deveria gravar todas as linhas da consulta. Alguém tem uma idéia?
D
drigo.angelo
Vai debugando e ve se ele não está escrevendo ‘‘por cima’’ dos primeiros registros ^^
[]
D
drigo.angelo
Troca esses catch(Exception e){}
Você simplesmente MATA os registros de erro…
Grave em um arquivo de logs ou pelo menos imprima na saída de erro padrão e.printStackTrace();
ou
[ System.err.println(e.getMessage()); ]
T
tiagofla
Até estava imaginando que seria isso. Estava debuggando e não me deixou claro que esteja ocorrendo isso. No console imprime corretamente mas na escrita do arquivo, só imprime a última linha, o que deixa a entender que esteja gravando uma linha por cima da outra.
Como são 30 colunas não ficou legal a visualização…
D
drigo.angelo
E se você abrisse a conexão com o arquivo e só fechasse depois que imprimir tudo? Acho que fica mais “caro” em termos de processamento ficar abrindo a conexão para cada coluna / linha
Tenta colocar a linha 38 na linha 16 ou 17 ^^
D
drigo.angelo
[sei que ja devo ta ficando chato, mas fiquei encucado com este problema, sério rsrs]
E esse continue, na linha 43? O que ele faz?
T
tiagofla
Fica tranquilo que vc não está sendo chato. Ta ajudando muito.
creio eu que a funcionalidade dele é de abandonarmos a iteração e partirmos para a próxima. Só que tirei ele do meu código e continua gravando somente a última linha, ignorando as demais.
T
tiagofla
Coloquei as seguintes linhas antes do fileWriter.write():
Iteratorit=rows.iterator();while(it.hasNext())
E escreveu no arquivo pulando de linha em linha, só que somente a primeira linha. Preciso melhorar esse código até que fique ok. Ainda preciso de ajudas…
T
tiagofla
O código atual ta assim:
publicvoidexecutarQuery()throwsFileNotFoundException{BufferedWriterfileWriter=null;ResultSetrs=null;ResultSetMetaDatarsmd=null;PreparedStatementpstmt=null;intlineNumber=0;try{MonitorXmlReaderxmlReader=newMonitorXmlReader();IndicadorBeanindicador=xmlReader.parseXmlToObj();StringpSql=indicador.getSql();FileindicadorFile=newFile("output/report."+indicador.getNomeArquivoSaida()+getDataHora()+".xls");pstmt=this.connection.prepareStatement(pSql);rs=pstmt.executeQuery();rsmd=rs.getMetaData();intnumberOfColumns=rsmd.getColumnCount();Vector<Object>rows=newVector<Object>();Vector<Object>colunms=newVector<Object>();for(inti=1;i<=numberOfColumns;i++)colunms.add(rsmd.getColumnName(i)+"\t");System.out.println("-->"+colunms.toString().replace(",","").replace("[","").replace("]","")+"\t\n");while(rs.next()){lineNumber++;fileWriter=newBufferedWriter(newFileWriter(indicadorFile));fileWriter.write(colunms.toString().replace(",","").replace("[","").replace("]","")+"\n");for(inti=1;i<=numberOfColumns;i++)rows.add(rs.getString(i)+"\t");System.out.println(lineNumber+" - "+rows.toString().replace(",","").replace("[","").replace("]",""));Iteratorit=rows.iterator();//Acrescentei essa linha aquiwhile(it.hasNext())//Acrescentei essa linha aquifileWriter.write(rows.toString().replace(",","").replace("[","").replace("]","")+"\n");fileWriter.flush();fileWriter.newLine();rows.clear();}}catch(Exceptione){e.printStackTrace();}finally{try{if(fileWriter!=null)fileWriter.close();}catch(Exceptione){e.printStackTrace();}try{if(rs!=null)rs.close();}catch(Exceptione){e.printStackTrace();}try{if(pstmt!=null)pstmt.close();}catch(Exceptione){e.printStackTrace();}try{if(this.connection!=null)this.connection.close();}catch(Exceptione){e.printStackTrace();}}}
Alguém poderia dar uma ajuda? Com essa nova linha que acrescentei, obtive uma escrita pulando de linha a linha no arquivo excel. O problema que está imprimindo somente a primeira linha zilhões de vezes. O que pode estar acarretando isso???
T
tiagofla
Debuggando a aplicação, percebi que realmente está escrevendo uma linha por cima da outra, por isso que ao visualizar o arquivo, só me mostra a ultima linha. Estou tentando encontrar uma maneira de fazer com que escreva linha por linha (pulando a linha). Quem puder dar uma idéia, será bem vinda.
D
drigo.angelo
Então, se você puder modificar seu algorítmo um pouco, pode, no lugar de já ir pegando os resultados e gravando no arquivo, vai pegando os resultados e salva em um StringBuilder, depois você grava a String (que contém todas as linhas) de uma vez só
T
tiagofla
Não entendi muito bem pois nunca usei o StringBuilder.
D
drigo.angelo
Ficou mais ou menos assim:
(não deu pra eu testar, tentei fazer uns Mocks dos seus objetos aqui mas nem dei conta, e também não tenho uma base pronta pra isso..)
publicvoidexecutarQuery()throwsFileNotFoundException{BufferedWriterfileWriter=null;ResultSetrs=null;ResultSetMetaDatarsmd=null;PreparedStatementpstmt=null;intlineNumber=0;try{MonitorXmlReaderxmlReader=newMonitorXmlReader();IndicadorBeanindicador=xmlReader.parseXmlToObj();StringpSql=indicador.getSql();FilecctoFile=newFile("output/report."+indicador.getNomeArquivoSaida()+System.currentTimeMillis()+".xls");pstmt=this.connection.prepareStatement(pSql);rs=pstmt.executeQuery();rsmd=rs.getMetaData();intnumberOfColumns=rsmd.getColumnCount();Vector<Object>rows=newVector<Object>();Vector<Object>colunms=newVector<Object>();//Estou criando o StringBuilder aquiStringBuildertexto=newStringBuilder();for(inti=1;i<=numberOfColumns;i++)colunms.add(rsmd.getColumnName(i)+"\t");System.out.println("-->"+colunms.toString().replace(",","").replace("[","").replace("]","")+"\t\n");while(rs.next()){lineNumber++;for(inti=1;i<=numberOfColumns;++i)rows.add(rs.getString(i)+"\t");System.out.println(lineNumber+"-"+rows.toString().replace(",","").replace("[","").replace("]",""));//Aqui, troca o fileWriter.write por texto.append( ... ); texto.append(colunms.toString().replace(",","").replace("[","").replace("]","")+"\n");texto.append(rows.toString().replace(",","").replace("[","").replace("]","")+"\n");rows.clear();//Como já ta no final do lasso, acho que não precisa do continue}//Agora que todas as linhas estão em texto, salva no arquivofileWriter=newBufferedWriter(newFileWriter(cctoFile));fileWriter.write(texto.toString());fileWriter.flush();}catch(Exceptione){e.printStackTrace();}finally{try{if(fileWriter!=null)fileWriter.close();}catch(Exceptione){}try{if(rs!=null)rs.close();}catch(Exceptione){}try{if(pstmt!=null)pstmt.close();}catch(Exceptione){}try{if(this.connection!=null)this.connection.close();}catch(Exceptione){}}}
T
tiagofla
Perfeito meu brother!
Só alterei duas linhas pra não ficar gravando linha/coluna, linha/coluna, etc…Agora ta show!