Erro em ler tabela vazia

10 respostas
M

Pessoal, preciso fazer a leitura do último registro da tabela e incrementar o valor caso retorne verdadeiro.

mas como a tabela está vazia e preciso cadastrar o 1º número está dando este erro:

java.sql.SQLException: Illegal operation on empty result set.
ResultSet rs_nbrCqa = Conexao.stm.executeQuery("select * from cqa");
			rs_nbrCqa.last();
			
			nbrCqa = rs_nbrCqa.getInt("nbrCqa");
			out.println(nbrCqa);
			
			if(!rs_nbrCqa.last()){
				
				nbrCqa = 1;
				
			}else{
				nbrCqa = nbrCqa + 1;
			}

    Conexao.stm1.executeUpdate("insert into cqa (nbrCqa,criador,data_criacao) values('"+nbrCqa+"','"+nomeSession+"','"+dtCriacao+"')");

Alguma dica de como resolver isso qdo se precisa ler a tabela e está vazia?

Desde já agradeço

Marcos

10 Respostas

viniciusfaleiro

Num testei… ve se serve…

ResultSet rs_nbrCqa = Conexao.stm.executeQuery("select * from cqa");   
rs_nbrCqa.last();   
  

try{  
nbrCqa = rs_nbrCqa.getInt("nbrCqa");   
out.println(nbrCqa);   

if(!rs_nbrCqa.last()){   
       
    nbrCqa = 1;   
       
}else{   
    nbrCqa = nbrCqa + 1;   
}   
catch(SQLException e){
Insere registro 1
}
  
Conexao.stm1.executeUpdate("insert into cqa (nbrCqa,criador,data_criacao) values('"+nbrCqa+"','"+nomeSession+"','"+dtCriacao+"')");
viniciusfaleiro

Eu fiz isso más não tem como vc colocar esse campo em autoincremento no banco fiote??? Vc ta fazendo um trablho q o BD faz pra vc…

M

Vinicius, tenho uma coluna de id autoincrmento, mas preciso gerar um código para cada inserção que não pode ser o id, pois terá uma letra antes do número.

viniciusfaleiro

Entendi rapaiz… Más tenta ai o q te falei… captura a exceção e insere.! =)

M

Vinicius não deu certo, continua dando erro

viniciusfaleiro

posta o codigo de como vc fez ai

M

Segue:

try{     
				int nbrCqa = rs_nbrCqa.getInt("nbrCqa");     
				out.println(nbrCqa);     
				  
				if(!rs_nbrCqa.last()){     
				         
				    nbrCqa = 1;     
				         
				}else{     
				    nbrCqa = nbrCqa + 1;     
				}
			}
				catch(SQLException e){   
					Conexao.stm1.executeUpdate("insert into cqa (nbrCqa,criador,data_criacao) values('"+nbrCqa+"','"+nomeSession+"','"+dtCriacao+"')");   
		}

e não está reconhecendo a variável nbrCqa, pois está dentro do try. Mesmo eu declarando fora do try, não deu certo

T

Se uma tabela é vazia, não se deve usar nem “first” nem “last”.

Normalmente você usa sempre “next”, que posiciona na primeira posição da tabela se a tabela existir, e retorna false se a tabela estiver vazia.

Além disso, crie uma consulta SQL que retorne o resultado ordenado de tal forma que o primeiro “next” retorne o resultado desejado.

viniciusfaleiro

Nesse caso vc não precisar reconhecer a variável. Não é o primeiro registro? Então ele sempre será 1.

Se conseguir resolver esse problema tenta estudar preparedStatements. É muito ruim deixar as SQL’s dentro do código.

try{       
                int nbrCqa = rs_nbrCqa.getInt("nbrCqa");       
                out.println(nbrCqa);       
                     
                if(!rs_nbrCqa.last()){       
                           
                    nbrCqa = 1;       
                           
                }else{       
                    nbrCqa = nbrCqa + 1;       
                }   
            }   
                catch(SQLException e){   
                    rs_nbrCqa.close();

                    Conexao.stm1.executeUpdate("insert into cqa (nbrCqa,criador,data_criacao) values ('1','"+nomeSession+"','"+dtCriacao+"')");     
        }
T

Além disso, quando você usa “select * from cqa” ou coisa parecida, você não pode confiar na ordem em que virão os registros.

Não pode mesmo. Não é por ordem de inserção, ou pela ordem da chave primária se for “clustered key”; a ordem, a rigor, é indefinida, e você não pode confiar nela.

É melhor criar uma consulta que volte 1 ou 0 registros, e ponha a condição adequada (WHERE) no select.

Criado 21 de agosto de 2009
Ultima resposta 21 de ago. de 2009
Respostas 10
Participantes 3