Resultado do banco é vazio?[RESOLVIDO]

14 respostas
P

Ola,
Estou fazendo um select simples para jogar todo o conteudo de uma tabela do banco em uma jtable.Esta jtable é a unica que eu uso o default table model pois não achei necessario criar um modelo para isso.So que a minha tabela esta sendo criada com valores vazios. :roll:
Alguém pode me ajudar a encontrar o erro no meu codigo?
Obrigada :wink:

Meu código é o seguinte:
try
		{
			Vector<String> cabecalho = new Vector<String>();
			Vector<Vector> linhas = new Vector<Vector>();
			resultado = comando.executeQuery("select * from cargahoraria");
			if(resultado.next());
			ResultSetMetaData rsmd = resultado.getMetaData();
			for( int i = 1; i <= rsmd.getColumnCount(); ++i )
				cabecalho.addElement( rsmd.getColumnName( i ) );
			do
			{
				Vector<Object> linhaAtual = new Vector<Object>();
				for ( int i = 1; i <= rsmd.getColumnCount(); i++ )
				{
					switch(rsmd.getColumnType(i))
					{
					case Types.VARCHAR:
						linhaAtual.addElement(resultado.getString(i));break;
					case Types.TIMESTAMP:
						linhaAtual.addElement(resultado.getDate(i));break;
					}
				}
				linhas.addElement(linhaAtual);
			}
			while (resultado.next() ) ;
			table = new JTable( linhas, cabecalho );
			JScrollPane scroller = new JScrollPane( table );
			scroller.setVisible(true);
			scroller.setBounds(300, 80, 550, 200);
			tela.add(scroller, null);

		}
		catch (SQLException erro) {
			erro.printStackTrace();
		}

14 Respostas

drsmachado

Não tenho muita certeza, mas acho que isto if(resultado.next()); e while (resultado.next() ) ;
não fazem nada…

P

oi!
olha só eu comentei este if e este while e a classe nem compilou :frowning:
tipo o if é para se o resultado da pesquisa nao for “vazio” eu colocar ele na tabela…
e o while na verdade é um do while :wink:
tipo so esta sendo criada uma tabela vazia =(

drsmachado

O problema é que com o “;” no final, a instrução é encerrada.
Você não tem que comentar, tem que colocar os mesmos nos blocos adequados

if(bla bla bla){
logica aqui
}

Como está, com “;” ao fim da instrução, ele não irá verificar.

P

Bah drsmachado não sei o que fazer ja coloquei os {} para determin ar o bloco de código do if e while mas não ta funcionando :frowning:

try { ... if(resultado.next()){ .. do { ... } while (resultado.next() ) ;{ ... } } } catch (SQLException erro) { erro.printStackTrace(); }
Ah e se eu tento tirar o ; do while da erro :shock: de compilação diz que falta colocar ;

;)bg pela ajuda

P

A minha tabela ainda esta sendo criada sem o resultado do banco =(
Segue um print da minha tela com esta tabela.Eu não alterei mais nada no código!
obrigada


CintiaDR

Muita hora nessa calma, guria.

Primeiro de tudo, não use default table model:

http://www.guj.com.br/java/199067-redimensionar-jtable---pra-variar--resolvido-/2#1001295
http://www.guj.com.br/java/149861-recuperar-id-de-jtable/2#813171

Segundo, não use vector:
"Diga não as drogas: Não use java.util.Vector. "
http://www.guj.com.br/java/3861-vector-x-arraylist

Terceiro, NÃO é nada nada adequado a mesma classe da camada de apresentação acessar o banco!

Quarto, agora vou tentar ver teu código rs.

CintiaDR

Comentários:
O nome das colunas na tabela é dinâmico? É meio esquisito precisar recuperar o nome das colunas dinamicamente.
De qualquer maneira, vá debugando e vê se entra no while certinho.

try
		{
			Vector&lt;String&gt; cabecalho = new Vector&lt;String&gt;();
			Vector&lt;Vector&gt; linhas = new Vector&lt;Vector&gt;();


                        //buscando resultados
			resultado = comando.executeQuery("select * from cargahoraria");


			//if(resultado.next()); ?? pra que isso?


                 	ResultSetMetaData rsmd = resultado.getMetaData(); //Cejura que vc TEM QUE PEGAR isso do banco?
			for( int i = 1; i &lt;= rsmd.getColumnCount(); ++i )  // vc tem CERTEZA que não é base 0 esse cara??
				cabecalho.addElement( rsmd.getColumnName( i ) );


			while (resultado.next())   //melhor while! nada garante que vc tem mais pelo menos 1 linha
			{
				Vector&lt;Object&gt; linhaAtual = new Vector&lt;Object&gt;();
				for ( int i = 1; i &lt;= rsmd.getColumnCount(); i++ )  // vc tem CERTEZA que não é base 0 esse cara??
				{
					switch(rsmd.getColumnType(i))
					{
					case Types.VARCHAR:
						linhaAtual.addElement(resultado.getString(i));break;
					case Types.TIMESTAMP:
						linhaAtual.addElement(resultado.getDate(i));break;
					}
				}
				linhas.addElement(linhaAtual);
			}


			table = new JTable( linhas, cabecalho );
			JScrollPane scroller = new JScrollPane( table );
			scroller.setVisible(true);
			scroller.setBounds(300, 80, 550, 200);
			tela.add(scroller, null);

		}
		catch (SQLException erro) {
			erro.printStackTrace();
		}
P

Oi CintiaDR,
obrigada pelas dicas


Primeiro de tudo, não use default table model:

http://www.guj.com.br/java/199067-redimensionar-jt...a-variar--resolvido-/2#1001295
http://www.guj.com.br/java/149861-recuperar-id-de-jtable/2#813171

Segundo, não use vector:
"Diga não as drogas: Não use java.util.Vector. "
http://www.guj.com.br/java/3861-vector-x-arraylist

Terceiro, NÃO é nada nada adequado a mesma classe da camada de apresentação acessar o banco!

quanto ao default table model esta é a unica classe em que utilizo como modelo
deve se criar uma classe auxiliar para jogar o resultado das pesquisas do banco e depois na classe principal pegar os valores da mesma?

fiz as alterações que tu sugeriste no tópico acima mas minha tabela ainda esta sendo criada vazia :frowning:

drsmachado

Bom dia, Paty.

Bom, se tua tabela está sendo renderizada vazia, significa que ou a consulta está errada (a query) ou a tabela cargahoraria está vazia.
Como a sintaxe "select * from cargahoraria" contém apenas o * e nenhum where, considerarei que esteja correta.
Já a segunda questão, a tabela estar vazia, sugiro executar a mesma query diretamente no banco de dados (ou no mysql workbench ou mysql query browser ou qualquer administrador de banco de dados que aceite query, incluindo aí o prompt do próprio mysql).

P

oi drsmachado!
Executei a query diretamente no banco como tu disseste e la deu certo como no print que segue em anexo…
acho que talvez o problema esteja na montagem da minha tabela :expressionless:
obrigada!


drsmachado

Ok, para finalizar, troque o switch(rsmd.getColumnType(i)) { case Types.VARCHAR: linhaAtual.addElement(resultado.getString(i));break; case Types.TIMESTAMP: linhaAtual.addElement(resultado.getDate(i));break; }
por

while(rs.next()){
for ( int i = 1; i <= rsmd.getColumnCount(); i++ )  // vc tem CERTEZA que não é base 0 esse cara??  
        {
System.out.println(rs.getString(i));
}
}

Se houver alguma saída, é a montagem da tabela que está errada, realmente.

P
ele imprime mas a tabela esta vazia tu tens razão é algo na montagem dela que estou fazendo errado arrumei aqui fazendo o seguinte:
private void geraTabela()
	{
		try
		{
			Vector<String> cabecalho = new Vector<String>();
			Vector<Vector> linhas = new Vector<Vector>();
			resultado = comando.executeQuery("select * from cargahoraria");
				ResultSetMetaData rsmd = resultado.getMetaData();
			for( int i = 1; i <= rsmd.getColumnCount(); ++i )
				cabecalho.addElement( rsmd.getColumnName( i ) );
			 while (resultado.next())  
			    {  
				 Vector<Object> linhaAtual = new Vector<Object>();
					 for ( int i = 1; i <= rsmd.getColumnCount(); i++ )  
					         {   
						 linhaAtual.addElement(resultado.getString(i)); 
					 }  
					 
		
			        linhas.addElement(linhaAtual);  
			    }
			  
			while (resultado.next()); 
			table = new JTable( linhas, cabecalho );
			JScrollPane scroller = new JScrollPane( table );
			scroller.setVisible(true);
			scroller.setBounds(300, 80, 550, 200);
			tela.add(scroller, null);
			
			
		}
		catch (SQLException erro) {
			erro.printStackTrace();
		}
	}
agora esta funcionando!!! obrigada Drsmachado!!!!!!! ;)
drsmachado
Eu trocaria o Vector por um array de Object, inserindo diretamente na linha.

Outra coisa, o teu switch/case não está tendo nenhuma função, tendo em vista que, independente de ser Date ou ser varchar, ele está inserindo no vector.
Considerando que você sabe quais colunas a tabela possui e utiliza um DefaultTableModel, eu faria assim:

DefaultTableModel dtm = new DefaultTableModel();
ResultSetMetaData rsmd = resultado.getMetaData();
    for( int i = 1; i <= rsmd.getColumnCount(); ++i ){
	 dtm.addColumn(rsmd.getColumnName( i ));
	}
while(rs.next()){
  Object[] obj = new Object[rsmd.getColumnCount()];
  obj[0] = rs.getString(0);
  //repete até o total de colunas
  dtm.addRow(obj);
}
table = new JTable();
table.setModel(dtm);
    JScrollPane scroller = new JScrollPane( table );  
    scroller.setVisible(true);  
    scroller.setBounds(300, 80, 550, 200);  
    tela.add(scroller, null);
P

ok
obrigada :wink:

Criado 13 de julho de 2011
Ultima resposta 14 de jul. de 2011
Respostas 14
Participantes 3