Boa noite pessoal.
Tenho uma JTable que está populada com nomes de tabelas e colunas que tenho no meu banco de dados e depois o sistema precisa varrer esse JTable, pegar o nome das tabelas e colunas, fazer um SELECT e INSERIR em outra tabela.
Até aí, tudo bem. O problema é que se eu colocar mais de um campo na JTable o sistema não entende esse novo campo e gera erro (não se se expliquei bem).
Segue o código que fiz.
ArrayList<String> ad = new ArrayList<>();
ArrayList<String> ab = new ArrayList<>();
// Aqui adiciono os dados do RESULTSET resultset.getString(1), resultset.getString(2)...
ad.add("TABELA_X");
ab.add("TABELA_Z");
Statement insDestino = con.sqlServer(dadosConexao.getServidorDestino(), dadosConexao.getPortaDestino(), dadosConexao.getBancoDeDadosDestino(), dadosConexao.getUsuarioDestino(), dadosConexao.getSenhaDestino()).createStatement();
// ad.get(ad.size()-1) coloquei assim para pegar a última linha como teste
insDestino.executeUpdate("INSERT INTO TABELA (CAMPO A, CAMPO B) VALUES ('" + ad.get(ad.size()-1) + "', '" + ab.get(ab.size()-1) + "');");
insDestino.close();
Esse código funciona, mas se eu adicionar mais uma coluna na tabela terei que criar outro ArrayList e adicionar os dados do RESULTSET, preciso que o sistema entenda a quantidade de COLUNAS e pegue os dados corretamente para fazer o INSERT.
Opa @fabiio2 o erro eu falei, ele exibe a mensagem falando que tem mais informações do que colunas e por isso não faz o INSERT. Se colocar o código do INSERT com apenas uma ou duas linhas na JTable funciona, porém, acima de duas linhas dá erro.
Preciso de uma ideia de como fazer para que o sistema entenda as colunas e pegue os dados perfeitamente para fazer o INSERT.
Na verdade, a JTable não importa pois a mesma está recebendo os dados exatamente como preciso (meu problema não está na JTable).
Estou pegando os dados da JTable de boa.
A ideia é a seguinte:
1 - Populo o JTable com o nome da TABELA e COLUNAS do banco - OK
2 - Faço um SELECT(com RESULTSET) com a(s) TABELAS que estão no JTable com suas respectivas COLUNAS - OK
3 - Pego os dados do RESULTSET e faço o INSERT em outra tabela do banco - OK
4 - Preciso que o sistema entenda a quantidade de colunas (de uma determinada tabela) que estão no JTable, pegue os dados de cada coluna a faça a inserção em outra tabela (que irei definir).
@fabiio2 fiz uma estrutura no código que ficou legal, acho que só falta um detalhe para resolver o problema.
// AQUI TEM O RESULTSET (APENAS UM SELECT)
Statement selOrigem = con.postGreSql(dadosConexao.getServidorOrigem(), dadosConexao.getPortaOrigem(), dadosConexao.getBancoDeDadosOrigem(), dadosConexao.getUsuarioOrigem(), dadosConexao.getSenhaOrigem()).createStatement();
ResultSet rs = selOrigem.executeQuery("SELECT CAMPOS FROM TABELA");
//VARIAVEL ARRAYLIST PARA RECEBER OS DADOS
ArrayList<String> ac = new ArrayList<>();
//PERCORRE O RESULTSET
while (rs.next()) {
//CONTA A QTDE DE COLUNAS QUE TEM NO RESULTSET
for(int a = 1; a <= rs.getMetaData().getColumnCount(); a++) {
ac.add(rs.getString(a).trim());
}
}
System.out.println(ac);
A saída é:
[POSTGRE A, TEXTO A, POSTGRE B, TEXTO B, POSTGRE C, TEXTO C]
A quantidade de colunas do RESULTSET são duas, preciso que a saída seja assim:
[POSTGRE A, TEXTO A]
[POSTGRE B, TEXTO B]
[POSTGRE C, TEXTO C]
Onde a COLUNA A possui as informações (POSTGRE A, POSTGRE B, POSTGRE C) e a COLUNA B (TEXTO A, TEXTO B, TEXTO C).
@fabiio2 Consegui resolver, mas de outra forma.
Do jeito que você postou, teria que entrar um for ficar para contar o OBJETO de acordo com as linhas do JTable.
Meu código ficou assim:
while (rs.next()) {
// LIMPA O ARRAYLIST (DESSA FORMA TODA VEZ QUE PERCORRER LIMPA O ARRAY E ADICIONA A PRÓXIMA LEITURA
dados.clear();
//FOR QUE VERIFICA A QTDE DE COLUNAS NO RESULTSET
for(int a = 1; a <= rs.getMetaData().getColumnCount(); a++) {
//ADICIONA OS DADOS NO ARRAYLIST
dados.add("'"+rs.getRef(a)+"'");
}
//AQUI FAZ O INSERT NA TABELA DESTINO
}