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)
[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);
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”
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.
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?
[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…
[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.
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.