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

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!

[code]

{

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);[/code]

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

[code]# tdcmp(); // função que é chamada que está dando o problema

fecha(); // chama função que fecha conexão e statement [/code]

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

[code] 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);
         }

     }[/code]

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); } }

EHS

por que o if??

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

Tenta assim:

[code]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);   


        }[/code]

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

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

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

É, precisa do else, eu esqueci de colocar.

:lol:

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

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

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:

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 :]

[quote=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
[/quote]

heheheh ta certo.

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

dai viraria uma bagunça

[quote=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 :][/quote]

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

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);
		}
		}

[code]Vector dados = new 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 só 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());
}[/code]

Desculpa mandei 2x.

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

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

Hehe… acontece. De nada!