[RESOLVIDO] Imprimir registros selecionados do BD, porém não imprime o primeiro!

30 respostas
xcah

Olá!

Estava fazendo um SELECT com Java via JDBC, usando as seguintes funções:

Funções principais:

public static void selecionatudo() throws SQLException  //função padrão para ser chamada // aqui ok 
	{
		conecta();
		query = "SELECT * FROM tblDepartamento";
		rs = stmt.executeQuery(query);

		tdcmp(); // função que é chamada que está dando o problema
		
		fecha(); // chama função que fecha conexão e statement
	}
	
	public static void conecta() throws SQLException // função de conexão e instancia statement // aqui ok
	{
		conn = Conexao.getConnection();
		stmt = conn.createStatement();
	}
	
			
		public static void tdcmp() throws SQLException // função em que deve imprimir no console os
	{															// registros selecionados 
		System.out.println(" ____________ ");
		// aqui é o problema: 
		if(rs.next()==false)
		{
			System.out.println("Não há registros com o valor requisitado.");
		}
		else{
		while (rs.next()==true)
		{	
			Cod_depto = rs.getInt("Cod_depto");
			Descricao = rs.getString("Descricao");
			Responsavel = rs.getString("Responsavel");

			System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);
		}
		}
	}

O que acontece é que ao imprimir os registros ele pula o primeiro, tentei ultilizar o rs.first() porém não deu certo, lembrando que preciso verificar se há registros ou não.

[b]Tentativa com rs.first()

public static void tdcmp() throws SQLException
	{
		System.out.println(" ____________ ");
		
		
		if(rs.first()==true)
		{
			do { Cod_depto = rs.getInt("Cod_depto");
			Descricao = rs.getString("Descricao");
			Responsavel = rs.getString("Responsavel");
			
			System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);
						
			} while (rs.next()==true);
			
		}
		else
		{
			System.out.println("Não há registros com o valor requisitado.");
		}
	}

Obs.: Os erros que dão quando tento o método àcima são os seguintes:


Exception in thread main com.microsoft.sqlserver.jdbc.SQLServerException: A operação solicitada não tem suporte em conjuntos de resultados somente de encaminhamento.

at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)

at com.microsoft.sqlserver.jdbc.SQLServerResultSet.throwNotScrollable(SQLServerResultSet.java:375)

at com.microsoft.sqlserver.jdbc.SQLServerResultSet.verifyResultSetIsScrollable(SQLServerResultSet.java:398)

at com.microsoft.sqlserver.jdbc.SQLServerResultSet.first(SQLServerResultSet.java:1313)

at Classes.Departamento.tdcmp(Departamento.java:131)

at Classes.Departamento.selecionatudo(Departamento.java:100)

at Conexao.Iniciar.main(Iniciar.java:27)

Enfim… como posso resolver isso? Quero que imprima todos os registros selecionados no banco de dados, porém não imprime o primeiro… (só lembrando hehe)

Grata se alguém puder ajudar!

30 Respostas

rafaelviny
#         {  
#             do { Cod_depto = rs.getInt("Cod_depto");  
#             Descricao = rs.getString("Descricao");  
#             Responsavel = rs.getString("Responsavel");  
#               
#             System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);  
#                           
#             } while (rs.next()==true);
tente assim
while (rs.next()){

#             Descricao = rs.getString("Descricao");  
#             Responsavel = rs.getString("Responsavel");  
#               
#             System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);  

}

outra coisa

tire estes 2 metodos
#         tdcmp(); // função que é chamada que está dando o problema  
#           
#         fecha(); // chama função que fecha conexão e statement

coloque os codigos dentro do while pois vc pode perder a referencia do ResultSet (bem, o fechar nao precisa mudar)

PS: voce tem que dar uma melhorada no seu codigo
segue um exemplo

public void pesquisarCIP(){
            TelaPesquisaCIP.tabela.removeTodasLinhas();
          try {
              Connection con = Conexao.abrirConexao();
              st = con.createStatement();
              rs = st.executeQuery("select codigocip, nome, classificacao from cip where status = 'ATIVO' order by nome");
              while (rs.next()){
                 cod = rs.getInt(1);
                 nome = rs.getString(2);
                 classificacao  = rs.getString(3);

                Object []valores = {cod ,nome, classificacao};
                TelaPesquisaCIP.tabela.adicionaLinha(valores);
             }

         }
EHS

Tenta isso

if(rs.next()) { while(rs.next()) { Cod_depto = rs.getInt("Cod_depto"); Descricao = rs.getString("Descricao"); Responsavel = rs.getString("Responsavel"); System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel); } }

rafaelviny

EHS

por que o if??

é uma condição desnecessaria já que o loop irá continuar ate a condição se tornar falsa

jrbilll
Tenta assim:
String comando = "SELECT * FROM tblDepartamento";


        try {
            java.sql.Statement stmt = con.createStatement();
            java.sql.ResultSet rs = stmt.executeQuery(comando);

            while (rs.next()) {

                String Cod_depto = rs.getInt("Cod_depto");    
                String Descricao = rs.getString("Descricao");    
                String Responsavel = rs.getString("Responsavel");    

                System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);   


            }
EHS

O if porque ela disse que precisa verificar se há algum registro antes de imprimir.

rafaelviny

se não tiver registro o rs.next() vai ser falso e não vai imprimir nada…

o if funcionaria se ela quise-se emitir uma mensagem falando que não existe registro mas dai precisaria do else

so seria valido dessa forma, mas emfim… eu não tinha lido que precisava verificar :lol: ponto extra para vc

EHS

Por isso sim, mas daí como que vai imprimir uma mensagem dizendo que não tem nada ??

É, precisa do else, eu esqueci de colocar.

rafaelviny

:lol:

por nao ter o else eu achei estranho o if :smiley: por isso comentei, já que o rs.next() faria isso sozinho

Zeed01

Bom dia galera,

Não esta imprimindo o primeiro porque você mandando pular o primeiro registro sem imprimir nada.

if(rs.next()==false)   // Este rs.next retorna o primeiro registro e você não faz nada com ele
{  
    System.out.println("Não há registros com o valor requisitado.");  
}  
else{  
while (rs.next()==true)  // Este rs.next vai retornar do segundo registro em diante e ai você manda imprimir.
{     
    Cod_depto = rs.getInt("Cod_depto");  
    Descricao = rs.getString("Descricao");  
    Responsavel = rs.getString("Responsavel");  

    System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);  
}

Se você precisa do primeiro “If” para verificar se existe registro sugiro utilizar o “do-while” ao invés do “while”

[]s

rafaelpaz

cara, no teu método

tdcmp()

quando tu faz isso:

if(rs.next()==false){ }

tu já está fazendo com que o ponteiro do resultSet pule para o próximo registro.
neste caso tem que fazer com que o ponteiro volte antes da primeira posição para que possa pegar o primeiro registro. É só fazer isso:

rs.beforeFirst();

depois do if para que ele volte para antes da primeira iteração.

:lol:

xcah

rafaelviny criei o método tdcmp() pois outros métodos o chamam, usando outras querys, e as variáveis usadas para conexão são globais na classe, então não queria ficar repetindo esse código… e no caso, agora eu teria que corrigir cada vez que tivesse copiado e colado xP

EHS, jrbilll já tentei, continua não exibindo o primeiro registro…

Zeed01 , ele tem o if … else, o while está dentro do else, então no if ele verifica se tem registro, se não tiver ele imprime a msg, e então só se não tiver ele verifica de novo… se for usar um do…while dentro dele eu vou ter que colocar pra imprimir, e de qualquer forma preciso que imprima que não tem quando não tiver, não teria que colocar um if dentro do do…while?

rafaelpaz vou tentar fazer agora :]

rafaelviny

xcah:
rafaelviny criei o método tdcmp() pois outros métodos o chamam, usando outras querys, e as variáveis usadas para conexão são globais na classe, então não queria ficar repetindo esse código… e no caso, agora eu teria que corrigir cada vez que tivesse copiado e colado xP

heheheh ta certo.

é que eu estava pensando em uma outra conexão acessar de forma concorrente o mesmo resultSet…

dai viraria uma bagunça

jrbilll

xcah:
rafaelviny criei o método tdcmp() pois outros métodos o chamam, usando outras querys, e as variáveis usadas para conexão são globais na classe, então não queria ficar repetindo esse código… e no caso, agora eu teria que corrigir cada vez que tivesse copiado e colado xP

EHS, jrbilll já tentei, continua não exibindo o primeiro registro…

Zeed01 , ele tem o if … else, o while está dentro do else, então no if ele verifica se tem registro, se não tiver ele imprime a msg, e então só se não tiver ele verifica de novo… se for usar um do…while dentro dele eu vou ter que colocar pra imprimir, e de qualquer forma preciso que imprima que não tem quando não tiver, não teria que colocar um if dentro do do…while?

rafaelpaz vou tentar fazer agora :]

Uso esse formato em todos os aplicativos desktop e funciona normalmente… manda todo teu código ai por favor.

xcah

rafaelpaz continua não dando certo, dando erro, assim como quando tentei usar o rs.first()
é só colocar antes do rs.next() certo?

rs.beforeFirst();

		if(rs.next()==false)
		{
			System.out.println("Não há registros com o valor requisitado.");
		}
		else{
		while (rs.next()==true)
		{	
			Cod_depto = rs.getInt("Cod_depto");
			Descricao = rs.getString("Descricao");
			Responsavel = rs.getString("Responsavel");

			System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);
		}
		}
jrbilll
Vector<Vector> dados = new Vector<Vector>();


        String comando = "SELECT * FROM tblDepartamento"


        try {
            java.sql.Statement stmt = con.createStatement();
            java.sql.ResultSet rs = stmt.executeQuery(comando);

            while (rs.next()) {

                tring Cod_depto = rs.getInt("Cod_depto");      
                String Descricao = rs.getString("Descricao");      
                String Responsavel = rs.getString("Responsavel");      
               


                Vector registroLido = new Vector();

                registroLido.add(Cod_depto );
                registroLido.add(Descricao );
                registroLido.add(Responsavel );


                dados.add(registroLido);
                System.out.println(dados);[code]

Dai tu  formata la pra nao sar um do lado do outro.

            }
            stmt.close();
            con.close();
} catch (java.sql.SQLException e) {
            throw new java.lang.RuntimeException(e.getMessage());
        }
jrbilll

Desculpa mandei 2x.

xcah

jrbilll aaahhh me desculpe mesmo, não tinha visto o try ali… funcionou com ele o.O" obrigada! :slight_smile:

Zeed01

Ola,

Não entendi bem qual a sua dúvida neste comentário:


Zeed01 , ele tem o if … else, o while está dentro do else, então no if ele verifica se tem registro, se não tiver ele imprime a msg, e então só se não tiver ele verifica de novo… se for usar um do…while dentro dele eu vou ter que colocar pra imprimir, e de qualquer forma preciso que imprima que não tem quando não tiver, não teria que colocar um if dentro do do…while?

A minha sugestão era essa de baixo:

if(rs.next()==false)  // Aqui manda para o primeiro registro, se não tiver imprime a mensagem de que não existe registro
{    
    System.out.println("Não há registros com o valor requisitado.");    
}    
else{    // Se existir registro no "IF" anterior vai cair nesse "ELSE", note que se existir, o rs.next do IF já posicionou no primeiro registro
do   // aqui na primeira iteração o Do vai imprimir os dados do primeiro registro
{       
    Cod_depto = rs.getInt("Cod_depto");    
    Descricao = rs.getString("Descricao");    
    Responsavel = rs.getString("Responsavel");    
  
    System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);    
} while (rs.next()==true);  // E só aqui vai verificar se continuam existindo registro... até que não tenha mais

Bom… não entendi porque esta falando que esse codigo não atenderia a necessidade.

[]s

jrbilll

Hehe… acontece. De nada!

rafaelviny

que medo

o codigo do jrbilll funciona e o meu nao hahahaha

e são os mesmos codigos :roll:

hehehehehe

jrbilll

rafaelviny:
que medo

o codigo do jrbilll funciona e o meu nao hahahaha

e são os mesmos codigos :roll:

hehehehehe

Hehe… verdade… mas é q só mandaste o RS.NEXT vai ver q ela nao sabia o q por no resto

xcah

Zeed01 ah, eu tinha em mente que no if ele não ia para o próximo, apenas verificava… agora entendi, obrigada ^^

rafaelviny desculpa, haha, eu não reparei que tava o try também >.<, tenho que ver direito o.o (eu acabo desconsiderando o try e vendo o que está dentro… pararei com isso xP) obrigada tbm! xD

ederfreitas

xcah

Não precisa fazer uma comparação tipo se next() = true, ou false, o next() já do tipo booleano., você pode usar if(!next()) ou if(next()) é mais elegante =) . Como citado anteriormente o rs.next() irá avançar para o segundo registro então que tal usar apenas o while e verificar ao fim se alguma variavel é null, se sim retorne a mensagem.

rafaelviny

desculpa, poderia ter mandado o codigo completo tambem

apesar de ter postado um exemplo completo…

o importante e rosolver o problema :smiley:

alguem se habilita a responder minha duvida sobre Hibernate e JSP ? :frowning:

http://www.guj.com.br/java/238391-nullpointer-hibernate–jsp#1229159

rafaelpaz

cara, o beforeFirst() tem que ser depois do if, assim:

if(rs.next()==false)  
{  
   rs.beforeFirst();  //Aqui vai o beforeFirst
    System.out.println("Não há registros com o valor requisitado.");  
}  
 else{  
while (rs.next()==true)  
{     
    Cod_depto = rs.getInt("Cod_depto");  
    Descricao = rs.getString("Descricao");  
    Responsavel = rs.getString("Responsavel");  
  
    System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);  
}  
}
Zeed01

Boa tarde galera !

rafaelpaz, não seria assim:

if(rs.next()==false)    
 {    
    
     System.out.println("Não há registros com o valor requisitado.");    
 }    
 else{    
 rs.beforeFirst();  //Aqui vai o beforeFirst  
 while (rs.next()==true)    
 {       
     Cod_depto = rs.getInt("Cod_depto");    
     Descricao = rs.getString("Descricao");    
     Responsavel = rs.getString("Responsavel");    
     
     System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);    
 }    
 }

Do jeito que você fez acho que não vai mudar nada, ja que o beforeFirst esta na parte do if que indica que NAO existem registros…

[]s

A

Pessoal temtem assim:

int conta = 0;

while (rs.next())

{

conta++;

Cod_depto = rs.getInt(Cod_depto);

Descricao = rs.getString(Descricao);

Responsavel = rs.getString(Responsavel);
System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);
}

if (conta==0){ System.out.println(Não Existem registros a serem apresentados);

}else{ System.out.println("Foram apresentados - " + conta + Registros );   }

Como rs.next() aponta sempre para o proximo registro forçamos a apresentação dos registros com um contatdor iniciado em 0 se não houver registros a apresentar não passara pelo while mantendo o conta igual a 0 , se houver registros eles serão apresentados e ainda teremos o quantitativo de registros.

Espero ter ajudado.

Zeed01

Isso já não estava resolvido ? rs

jrbilll

Já sim :smiley:

rafaelpaz
Zeed01:
Boa tarde galera !

rafaelpaz, não seria assim:

if(rs.next()==false)    
 {    
    
     System.out.println("Não há registros com o valor requisitado.");    
 }    
 else{    
 rs.beforeFirst();  //Aqui vai o beforeFirst  
 while (rs.next()==true)    
 {       
     Cod_depto = rs.getInt("Cod_depto");    
     Descricao = rs.getString("Descricao");    
     Responsavel = rs.getString("Responsavel");    
     
     System.out.println(" // "+ Cod_depto + " || "+ Descricao + " || " + Responsavel);    
 }    
 }

Do jeito que você fez acho que não vai mudar nada, ja que o beforeFirst esta na parte do if que indica que NAO existem registros...

[]s

Galera, sei que já está resolvido, mas só pra corrigir algo aqui...

Zeed01, você está certo, na real me confundi no if, não sei porque, mas pensei que tinha visto um if == true
if(rs.next()==false)    
 {    
       System.out.println("Não há registros com o valor requisitado.");    
 }else{
  rs.beforeFirst();//Só vai entrar aqui se tiver registros, e depois que entrar, ele vai voltar antes do começo do resultSet
}

Como disse, só estou postando isso, sendo que o tópico já está ok, porque tem pessoas que buscam por tópicos para tirar dúvidas e temos que deixar as respostas certas.

Criado 8 de abril de 2011
Ultima resposta 8 de abr. de 2011
Respostas 30
Participantes 8