Preciso pegar todos os dados de todas tabelas que tenho em meu BD para passar isso como objeto e depois serializar isso em XML com XStream. Depois de serializar, isso será novamente lido e persistido em outro BD com EJB3.
Estou "pegando" os dados das tabelas com JDBC, porém desta forma eu teria que saber quantas colunas cada tabela tem para poder dar um rs.getString().
Cara, se realmente você precisa fazer essa doidera toda começe pela classe DatabaseMetaData.
Muitos SGBDs oferecem a possibilidade de retornar os dados em XML. Dê uma olhada na documentação do fornecedor do seu SGBD
Cara, já tinha visto isso antes mas não tem nada na doc do Derby.
Valeu.
crpablo
Adolfo Rodrigues:
crpablo:
Preciso pegar todos os dados de todas tabelas que tenho em meu BD para passar isso como objeto e depois serializar isso em XML com XStream. Depois de serializar, isso será novamente lido e persistido em outro BD com EJB3.
Você precisa mesmo disso? Você está querendo migrar dados?
Quanto ao seu problema com o rs.“getString(x)”, tente fazer alguma coisa do tipo:
ResultSet rs = p.executeQuery();
for (int i = 0; rs.isAfterLast(); i++) {
rs.next();
System.out.println(rs.getString(i));
}
Fala Adolfo…
Fiz da forma que vc falou mas gerou essa exception:
Exception in thread "main" java.sql.SQLException: The 'isAfterLast' method is only allowed on scroll cursors.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedResultSet.checkScrollCursor(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedResultSet.checkRowPosition(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedResultSet.isAfterLast(Unknown Source)
at ExportaBD.main(ExportaBD.java:53)
Abraço cara…
Adolfo_Rodrigues
Eu não conheço muito bem a API do ResultSet, então devo ter te passado algum código furado. Abra a API e veja algum método para fazer o que deseja. O que eu quis dizer quando sugeri o código é que você pode dar o rs.getString(i) passando um índice (no caso é o i).
Aí vai mais um chute (e feio, pois não tenho como consultar a API, testar e melhorar agora):
int i = 0;
while (rs.next()) {
System.out.println(rs.getString(i));
i++;
}
PS - A solução é bem ruim. Escreva a sua real necessidade (migração de dados simplesmente?) que o pessoal aqui pode te dar idéias melhores.
crpablo
Adolfo Rodrigues:
Eu não conheço muito bem a API do ResultSet, então devo ter te passado algum código furado. Abra a API e veja algum método para fazer o que deseja. O que eu quis dizer quando sugeri o código é que você pode dar o rs.getString(i) passando um índice (no caso é o i).
Aí vai mais um chute (e feio, pois não tenho como consultar a API, testar e melhorar agora):
PS - A solução é bem ruim. Escreva a sua real necessidade (migração de dados simplesmente?) que o pessoal aqui pode te dar idéias melhores.
Blz Adolfo...
Cara eu dei uma pesquisada em algumas API's e cheguei a esse cód.:
packagepersistencia;importjava.sql.Connection;importjava.sql.DatabaseMetaData;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.ArrayList;importjava.util.List;publicclassTabelasBD{publicDatabaseMetaDatagetDatabaseMetaData(){DatabaseMetaDatadbmd=null;try{dbmd=getConnection().getMetaData();}catch(SQLExceptione){e.printStackTrace();}returndbmd;}// Retorna uma lista com todas as tabelas do schema TESTE@SuppressWarnings("unchecked")publicListgetNomeTabelas(){ResultSetrsPegaTabelas=null;ListlistaTabelas=newArrayList();try{rsPegaTabelas=getDatabaseMetaData().getTables(null,"TESTE","%",null);while(rsPegaTabelas.next()){listaTabelas.add(rsPegaTabelas.getObject(3));}}catch(SQLExceptione){e.printStackTrace();}returnlistaTabelas;}// Retorna uma lista com os dados das tabelas@SuppressWarnings("unchecked")publicListgetDadosTabelas(){PreparedStatementps=null;ResultSetrsPegaDados=null;ListlistaDados=newArrayList();ListlistaTabelas=getNomeTabelas();StringnomeTabela="";for(inti=0;i<listaTabelas.size();i++){nomeTabela=(String)listaTabelas.get(i);System.out.println("Tabela:"+nomeTabela);try{ps=getConnection().prepareStatement("SELECT*FROM"+nomeTabela);rsPegaDados=ps.executeQuery();intqntColunas=getQuantidadeColunas(nomeTabela);System.out.println("NºColunasatual:"+qntColunas);while(rsPegaDados.next()){for(intj=0;j<qntColunas;j++){listaDados.add(rsPegaDados.getString(j+1));System.out.println("Coluna"+(j+1)+""+rsPegaDados.getString(j+1));}}ps.close();getConnection().close();}catch(SQLExceptione){e.printStackTrace();}}returnlistaDados;}// Retorna uma lista com o nome de todas as colunas da tabela@SuppressWarnings("unchecked")publicListgetNomeColunas(StringnomeTabela){ListnomeColunas=newArrayList();Statementstmt;ResultSetrsNomeColunas=null;ResultSetMetaDatarsmd=null;intqtdColunas;try{stmt=getConnection().createStatement();rsNomeColunas=stmt.executeQuery("SELECT*FROM"+nomeTabela);rsmd=rsNomeColunas.getMetaData();qtdColunas=rsmd.getColumnCount();for(inti=0;i<qtdColunas;i++){nomeColunas.add(rsmd.getColumnName(i+1));System.out.println("NomeColuna:"+rsmd.getColumnName(i+1));}}catch(SQLExceptione){e.printStackTrace();}System.out.print("\n");returnnomeColunas;}// Retorna a quantidade de colunas na tabelapublicintgetQuantidadeColunas(StringnomeTabela){Statementstmt=null;ResultSetrsQtdColunas=null;ResultSetMetaDatarsmd=null;intquantidadeColunas=0;try{stmt=getConnection().createStatement();rsQtdColunas=stmt.executeQuery("SELECT*FROM"+nomeTabela);rsmd=rsQtdColunas.getMetaData();quantidadeColunas=rsmd.getColumnCount();System.out.println("QuantidadeColunas:"+quantidadeColunas);}catch(SQLExceptione){e.printStackTrace();}System.out.print("\n");returnquantidadeColunas;}// Cria e retorna uma nova conexão com o BDprivateConnectiongetConnection(){Connectionconn=null;try{Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();conn=DriverManager.getConnection("jdbc:derby:H:/Projetos/XXX;user=XXX;password=XXX");}catch(InstantiationExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}catch(ClassNotFoundExceptione){e.printStackTrace();}catch(SQLExceptione){e.printStackTrace();}returnconn;}publicstaticvoidmain(String[]args)throwsException{TabelasBDexp=newTabelasBD();exp.getDadosTabelas();System.out.println("FIM!!!");}}
A principio isso tá resolvendo meus problemas...
Eu to pegando a quantidade de colunas através do DatabaseMetaData e passando isso para o método pegaDados(), assim tem um for que percorre todas colunas da tabela atual... Funcionou beleza...