Ajuda com DAO e JTable

Ae pessoal tudo bom?
Seguinte, acompanho o fórum a um tempo, ele ja me tirou várias dúvidas.
Mas agora eu to quase ficando loco, e não consigo fazer meu JTable mostrar o resultado de uma query de um SQLServer.
To tentando utilizar o padrão DAO, então tenho os métodos de cadastro, exclusão, listagem, etc…

Segue o código:

Na Package Persistência eu tenho várias classes, segue a parte aonde estou tendo problemas:

MidiaDAO.java

public Vector<Midia> ListaMidias() throws Exception{
        AbrirBanco();
        String SQL = "Select * from midia";
        st = con.prepareStatement(SQL);
        rs = st.executeQuery();        
        Vector ListaMidias = new Vector();
        while (rs.next())
            ListaMidias.add(rs.getInt("idmidia"));
            ListaMidias.add(rs.getString("artista"));
            ListaMidias.add(rs.getString("nomemidia"));
            
        return ListaMidias();

Enfim, criei esse método que faz a consulta no banco, e me retorna um vetor com o resultado. Está correto?

Então, no Netbeans criei um JDialog, modal, com uma JTable para chamar esse método acima e mostrar os valores.
Segue o que estou fazendo depois do initComponents(); que o netbeans cria

        MidiaDAO mdo = new MidiaDAO();
        DefaultTableModel dtm = (DefaultTableModel)this.tblcds.getModel();
        try {
            Vector midias = mdo.ListaMidias();
            for (int i = 1; i < midias.size(); i++)
                dtm.addRow(midias);
        } catch (Exception ex) {
                 System.out.println(ex.getMessage());
        }

        }

Quando executo o programa, e entro no JDialog que contem esse código tenho a seguinte exception:

com.microsoft.sqlserver.jdbc.SQLServerException: O conjunto de resultados não tem linha atual.

Poderiam me ajudar? Já procurei em vários lugares, alguns falam para utilizar List, ArrayList, AbstractModel, DefaultModel, enfim… to bem perdido nesse JTable.

Se você acompanha o fórum, quantas vezes você já viu a dica de não usar o DefaultTableModel?

O primeiro passo para não se irritar com o JTable é entender como ele funciona. Faça seu próprio TableModel, filho de AbstractTableModel.

O erro não se refere à parte onde você lê o que o resultset contém e, sim, quando tenta receber o resultado da consulta.
Provavelmente, ao incluir a linha

st.execute();

antes de

rs = st.executeQuery();        

vai resolver o problema

Outros comentários:

  1. Não use Vector, use List: http://www.guj.com.br/posts/list/74068.java#389435
  2. O erro é na parte de banco de dados. Não tem nada a ver com o TableModel em si.

Vini, segue algumas alterações:

public List<Midia> ListaMidias() throws Exception{
        AbrirBanco();
        String SQL = "Select * from midia";
        st = con.prepareStatement(SQL);
        rs = st.executeQuery();
        Midia m = null;
        List<Midia> ListaMidias = new ArrayList<Midia>();
        while (rs.next())
            m = new Midia();
            m.setArtista(rs.getString("artista"));
            m.setNomemidia(rs.getString("nomemidia"));
            ListaMidias.add(m);

        return ListaMidias();
    }

Foi isso que você disse, correto?

Agora, como jogo isso dentro da JTable?

Dê uma olhada nesse exemplo recente: http://www.guj.com.br/posts/list/225793.java

Aprenda a fazer seu TableModel.

Seu método não funciona.
Primeiro ele faz o while, sem as chaves ele executara m = new Midia() até o fim dos resultados, deixando o cursor do ResultSet no ultimo item, assim m.setArtista e setNomemidia ira ter o valor do ultimo item do result set.

Segundo ele retorna ListaMidia(), ele vai entrar em loop infinito chamando a si mesmo.

Verdade Marky, eu não prestei atenção.

    public List<Midia> ListaMidias() throws Exception{
        AbrirBanco();
        String SQL = "Select * from midia";
        st = con.prepareStatement(SQL);
        rs = st.executeQuery();
        Midia m = null;
        List<Midia> ListaMidias = new ArrayList<Midia>();
        while (rs.next()){        
            m = new Midia();
            m.setArtista(rs.getString("artista"));
            m.setNomemidia(rs.getString("nomemidia"));
            ListaMidias.add(m);
            }

        return ListaMidias();
    }

Fica melhor né? hehehe

Agora preciso aprender a fazer meu Table Model, mas ta complicado de entender.
Mas vamo que vamo!

Marky, Vini, poderiam me ajudar novamente?

Meu método parece estar errado, acho que não estou colocando o return corretamente, porque fiz um main aqui simples, só para imprimir os valores do método e não ta retornando nada, de fato, ele fica rodando e não faz nada

    public static void main(String args[]) throws Exception{

        MidiaDAO md = new MidiaDAO();

        int n = md.ListaMidias().size();
        for (int i = 0; i < n; i++)
            System.out.println(md.ListaMidias().get(i));
     }
}

EDIT: Consegui, o return tava errado!

Por favor, siga as convenções, nomes de métodos começam com letra minuscula, fica mais fácil de entender.

Outra coisa.

No seu código de teste, voce ira chamar o método ListaMidias um monte de vezes, cada vez para pegar cada posição, e uma a mais para contar quantos tem.

Voce pode guardar o retorno em um List e trabalhar com essa lista.

Depois disso, siga os links da minha assinatura para aprender como se livrar do DefaultTableModel, vamos lá, falta pouco para voce deixar de fazer do modo errado.