Como tratar os erros na hora de pesquisar os dados no PostgresSQL ( Resolvido)

10 respostas
moizheys

Galera é o seguinte: Estou fazendo o método de Atualização dos dados em um banco chamado “CADASTRO”. Este banco possui quatro tabelas mas no momento estou fazendo os testes em uma. A atualização está funfando legalzinho só preciso tratar algumas coisas. Por exemplo eu tentei criar um método de pesquisa booleano ( verificaCodigo()) que return false se acaso os dados ( no caso o ‘cod_bd’) passado para o método update() não existir, e se acoso existir fazer a atualização. No entanto quando passo um código que não existe ele simplesmente não dá erro nenhum, é como se o método de busca retornasse sempre true. Não estou conseguindo encontrar onde está o problema, se alguém puder dar uma olhada no código, fico agradecido. Outra coisa se alguém puder dar uma sugestão de como criar um método que trate de todas as colunas ao mesmo tempo pois senão terei que criar um método de atualização para cada coluna.
O código referente segue abaixo:

public void update(String codigo,String update){
	Connection conn = null;
	PreparedStatement stm = null;
	ResultSet rs = null;
	
	try{
		conn = getConnection();
		stm = conn.prepareStatement(UPDATE_SISTEMA);
		
		
		stm.setString(1, codigo);
		stm.setString(2, update);
		
	
	if(verificaCodigo(codigo)== true){
		stm.executeUpdate();
		System.out.println("Dados atualizados com sucesso");
	}else{
		System.out.println("Código Inexistente");
	}	
		
	stm.close();	
	}
	
	catch(SQLException e){
		e.printStackTrace();
	}catch (ClassNotFoundException e) {
		e.printStackTrace();
	}finally{
		if(rs != null){
			try{rs.close();}catch(SQLException e){}
		}
		if(stm != null){
			try{stm.close();}catch(SQLException e){}
		}
		if(conn != null){
			try{conn.close();}catch(SQLException e){}
			}
		
	}
	
	
}
	public boolean  verificaCodigo(String verifica){
		Connection conn = null;
		PreparedStatement stm = null;
		ResultSet rs = null;
		
		try{
		conn = getConnection();
		stm = conn.prepareStatement(PESQUISA_CODIGO);
		stm.setString(1, verifica);
		
		rs = stm.executeQuery();	
			
		}catch(SQLException e){
			e.printStackTrace();
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		if(rs == null){
				return false;
			}else{
				return true;
			}
		
		}	
	}

10 Respostas

dreamspeaker

if(rs == null){ return false; }else{ return true; }Isso ai tá errado, velhinho. Se a consulta não retorna nada, ela não fica nula, ela fica vazia. Vc tem que usar algo do tipo

if (rs!=null && rs.next()) return true; // já que tá fora do try-catch, vai saber se não tá nula mesmo... return false;
Eu não entendi sua pergunta de método de atualização de todas as colunas. Em ves de passar coluna a coluna, tenta usar um objeto especifico que encapsule todos os dados, algo assim.

Tem mais uma ou duas ou treze coisas ai que dá pra melhorar. Por exemplo, será que vc precisa realmente de uma conexão em cada método? Vê aí, dá pra se divertir nesse código.

Abraço!

moizheys

Primeiramente, Obrigado por responder, confesso que eu fiquei um pouco perdido, este código tá um pouco confuso mesmo e eu ainda não sei direito a diferença entre um registro “vazio” e um “null”. Bom , pensando um pouco com mais clareza, acho que o ideal é fazer uma busca no Banco de Dados e depois atualiza-los. Como eu já tinha criado um objeto do tipo Bean pra fazer a inserção, também posso usar os Beans agora. Bem , eu gostaria que a “pesquisa” fosse feita apenas pelo código, tipo , como se o “código” fosse uma " chave primária", no caso aqui este “código” é apenas uma coluna da tabela.
Bom meu problema no momento é o seguinte: A princípio eu deixei os tratamentos de lado e fiz testes passando apenas “codigo” que já existiam. Bom em vez de ele me retornar todo o registro referente aquele código , ele está me retornando apenas o código e as outras colunas null. Engraçado é que eu já tinha feitos testes, pegando todos os registros (Select * from sistema) e tinha dado certo.
Bom o código referente segue abaixo, se alguém puder dar um help, fico agradecido:

Aqui A String da Busca que eu to fazendo:

public static final String PESQUISA_CODIGO = "Select * from sistema where cod_bd =?";

Aqui o método que vai fazer a busca e posteriormente vou implementar o que vai fazer as mudanças:

public void search(String cod) {
		Connection conn = null;
		PreparedStatement stm = null;
		ResultSet rs = null;
		
		try{
			
		conn = getConnection();
		
		
		//Teste
		stm = conn.prepareStatement(PESQUISA_CODIGO);
		stm.setString(1,cod);
		
		rs = stm.executeQuery();
		while(rs.next()){
			Sistema sis = new Sistema();
			sis.setCod(rs.getString("cod_bd"));
			sis.setCod(rs.getString("nome_bd"));
			sis.setCod(rs.getString("versao_bd"));
			sis.setCod(rs.getString("finalidade_bd"));
			
			
			
		}
		stm.close();
		}
		
		catch(SQLException e){
			e.printStackTrace();
		}catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally{
			if(rs != null){
				try{rs.close();}catch(SQLException e){}
			}
			if(stm != null){
				try{stm.close();}catch(SQLException e){}
			}
			if(conn != null){
				try{conn.close();}catch(SQLException e){}
				}
	
			}
		}

Aqui o action Performed do botão pesquisar:

public void actionPerformed(ActionEvent e) {
	if(e.getSource()== btPesquisar);
	
	String codigo = textCod.getText();
	
	
	SistemaDAO dao = new SistemaDAO();
	dao.search(codigo);
	
	Sistema sist = new Sistema();
	String cod = sist.getCod();
	String nome = sist.getNome();
	String versao = sist.getVersao();
	String finalidade = sist.getFinalidade();
	
	System.out.println(codigo + " , " + nome + " , " + versao + " , " + finalidade);
	}

E aqui um exemplo de resultado:

9 , null , null , null

Eh isto, qualquer ajuda será bem vinda…abç

dreamspeaker

moizheys:
…Bom em vez de ele me retornar todo o registro referente aquele código , ele está me retornando apenas o código e as outras colunas null…

...		
		rs = stm.executeQuery();
		while(rs.next()){
			Sistema sis = new Sistema();
			sis.setCod(rs.getString("cod_bd"));
			sis.setCod(rs.getString("nome_bd"));
			sis.setCod(rs.getString("versao_bd"));
			sis.setCod(rs.getString("finalidade_bd"));
			
...

Eh isto, qualquer ajuda será bem vinda…abç

Cara, se vc está setando o cod (setCod) os outros campos do seu bean ficarão nulos mesmo!!!

Um amigo meu diz assim, “o duro não é o CTRL-C, o duro é onde vc enfia o CTRL-V!” :stuck_out_tongue:

moizheys

kkkkkkkkkkkkk…Caracas que mancada, o “Control V” quebrou minhas pernas agora, rssss. Mas ainda to com um pequeno problema aqui. Ele ta fazendo a busca legalzinho agora e já set os Beans e imprimo pra fazer um teste blza. Mas no actionPerformed do botão cadastrar eu instancio a classe com meus Beans e dou os gets(), mas ali não ta pegando aparece tudo null. Pior que eu preciso recuperar ali na View pra jogar em algum lugar onde o cliente possa fazer as modificações. Se puder dar uma olhada:

Aqui o search() , corrigido os sets e imprimindo:

public void search(String cod) {
		Connection conn = null;
		PreparedStatement stm = null;
		ResultSet rs = null;
		Sistema sis;
		try{
			
		conn = getConnection();
		
		stm = conn.prepareStatement(PESQUISA_CODIGO);
		stm.setString(1,cod);
		rs = stm.executeQuery();
		sis = new Sistema();
		while(rs.next()){
			
			sis.setCod(rs.getString("cod_bd"));
			sis.setNome(rs.getString("nome_bd"));
			sis.setVersao(rs.getString("versao_bd"));
			sis.setFinalidade(rs.getString("finalidade_bd"));
			
			//Se eu testar o print aqui funciona!!!
			/*String c = sis.getCod();
			String n = sis.getNome();
			String v = sis.getVersao();
			String f = sis.getFinalidade();
			
			System.out.println(c+" , " + n + " , " + v + " , " + f);
			*/
		}

Aqui o ActionPerformed , que deveria trazer os Beans:

public void actionPerformed(ActionEvent e) {
	if(e.getSource()== btPesquisar);
	
	String codigo = textCod.getText();
	Sistema sis = new Sistema();
	
	SistemaDAO dao = new SistemaDAO();
	dao.search(codigo);
	
	//Sistema sis = new Sistema();
	
	String cod = sis.getCod();
	String nome = sis.getNome();
	String versao = sis.getVersao();
	String finalidade = sis.getFinalidade();
	
	System.out.println(cod + " , " + nome + " , " + versao + " , " + finalidade);
	
	}

Aqui um exemplo do resultado do print no actionPerformed:

null , null , null , null

Eh isso, se alguém souber o q esta acontecendo…abç

dreamspeaker

Então, cara, ai eu acho que talvez esteja faltando um pouco de fundamento da linguagem.

Você chama seu método public void search(…), cria uma instância de Sistema e ela morre ali.

No seu actionPerformed, você chama o search e não faz nada, vc cria o bean Sistema vazio mesmo, né?!

Pra resolver isso é fácil, muda o tipo de retorno do método search pra

public Sistema search(String cod) {...E não esquece de colocar o retorno no fim do método:

return sis;E no seu action, pega o objeto de retorno assim

... Sistema sis = dao.search(codigo); ...

Vê se rola.

moizheys

Concerteza cara, eu ainda sou bem leigo no assunto, eu to lendo uma apostilla de java com foco em orientação a objeto que deve me trazer um pouco mais de conhecimento. Então a respeito do que vc me passou ali, não deu certo. No action ele não aceita aquele esquema ali, diz que não pode converter de “Void” para "Sistema.

Type mismatch: cannot convert from void to Sistema.

E aí da um opção de correção para adicionar cast mas o erro persiste:

sis = (Sistema) dao.search(codigo);
dreamspeaker

Então, mas você mudou o tipo de retorno do seu método?

Depublic void search(String cod) { ...parapublic Sistema search(String cod) {...

moizheys

Mudei sim, fiz todas as mudanças que vc tinha me passado, inclusive ali no método search ta legalzinho sem erro nenhum, o pau ta no acteon mesmo. Hoje a noite quando chegar em casa vou tentar esta função que está no acteon em uma outra classe ( controller por exemplo), aí eu faço no construtor e ha hora certa soh chamo esse construtor no acteon, o que vc acha?

moizheys

Então esta parte eu consegui resolver aqui, tinha alguns erros de estruturas de posições de código e tal…Bem agora tenho outro problema que concerteza deve ser algum fundamento da linguagem que eu nao to sabendo lidar. Eu mando pesquisar , ele vai busca os dados no BD e armazena em algumas variáveis, isto no if do bt Pesquisar, certo. No entanto quando quando eu entro no if do botao Alterar, aqui eu gostaria que ele pegasse essas variáveis e setasse em alguns texts que tem na View “Alterar Sistema” porque ali o usuário pode fazer as modificações. No entanto neste segundo if as variáveis já aparecem nulas , tentei dar um get nos Beans e também não da, os próprios também já estão nulos. Já mexi nos ifs, deixei soh if,if,else if…e nada…
O código ta assim agora:

public void actionPerformed(ActionEvent e) {
	
		if(e.getSource()== btPesquisar){
		
		String codigo = textPesquisa.getText();
		
		Sistema sis = new Sistema();
		
		SistemaDAO dao = new SistemaDAO();
		sis = (Sistema) dao.search(codigo); 
		
		String cod = sis.getCod();
		String nome = sis.getNome();
		String versao = sis.getVersao();
		String finalidade = sis.getFinalidade();
		
		System.out.println(cod + " , " + nome + " , " + versao + " , " + finalidade);
		
		areaUsuario.append(cod);
		areaUsuario.append(nome);
		areaUsuario.append(versao);
		areaUsuario.append(finalidade);
		
		}
		else if(e.getSource()== btAlterar){
			
		
		System.out.println(cod + " , " + nome + " , " + versao + " , " + finalidade);
		
	/*	Sistema sis = new Sistema();
		
		String c = sis.getCod();
		String n = sis.getNome();
		String v = sis.getVersao();
		String f = sis.getFinalidade();
		System.out.println(c + " , " + n + " , " + v + " , " + f);
	*/	
		
		}
		
	}

Quando eu clico no btAlterar imprime tudo nulo as variáveis:

null , null , null , null
moizheys

Opa, consegui resolver esta também.Eu tava dando uma viajada aqui neh pra variar ,era até bem obvio que as variáveis que estivessem vazia quando eu clico no botão Alterar pois ele considera que todas as outras ações dentro do botão Pesquisar não foram realizadas, então pra resolver eu fiz todo o processo dentro do botão Alterar também, agora deu certo.

Criado 16 de março de 2009
Ultima resposta 19 de mar. de 2009
Respostas 10
Participantes 2