Se existir registro, não cadastrar, e vice-versa...[RESOLVIDO]

Olá, boa tarde a todos…

sou iniciante em java…comecei a estudar java neste semestre, portanto perdoem-me se houver algum erro muito óbvio em meu código…

A minha dúvida é a seguinte…

Estou desenvolvendo um sistema bancário simples, mas não consigo fazer exibir uma mensagem avisando que determinada conta já existe…

já procurei em alguns fóruns sobre isto, já tentei implementar algumas soluções que deram, porém não tive sucesso…

Resumindo: Se a conta existe, mostrar um aviso e não cadastrar…se não existe, ela deve ser cadastrada no banco…

Segue meu método para Inserir dados…

	 void Inserir(String nome, String numero_agencia, String numero_conta, String saldo) throws Exception {		 
			 
		try{
			MinhaConexao mc = new MinhaConexao();
			Connection con = mc.getConexao();
			Statement query = (Statement) con.createStatement();
			ResultSet rs = query.executeQuery("SELECT numero_agencia, numero_conta FROM ContaBancaria" +
					"WHERE numero_agencia = '"+numero_agencia+"' AND numero_conta = '"+numero_conta+"'");
						   
			if (!rs.next()) {  
								
				String sql = "INSERT INTO ContaBancaria(Nome, Numero_Agencia, Numero_Conta, Saldo)" +
				"VALUES ('"+nome+"', '"+numero_agencia+"', '"+numero_conta+"', '0')";
				String extrato = "INSERT INTO Extrato(Numero_Agencia, Numero_Conta, Acao, Valor_Movimentado, Saldo_Atual)" +
				"VALUES ('"+numero_agencia+"', '"+numero_conta+"', 'Conta foi criada', '0', '0')";
				query.executeUpdate(sql);
				query.executeUpdate(extrato);
				
			}
			else{
				throw new Exception("Conta já existe");				
			}
		} catch (MyClassException e){
				System.out.println("Mensagem: " + e.getMensagem());
				System.out.println("Mensagem Original: " + e.getMessage());
				System.out.println("Classe: " + e.getClasse());
				System.out.println("Método: " + e.getMetodo());			
			}  
						
	}

Agradeço muito a todos que tentarem me ajudar…

Mas o seu código está retornando algum erro? Eu prefiro suar PreparedStatement ao invés de Statement e setar os parametros ao invés de concatenar direto na String (query). Mas enfim.

O que este método está lhe retornando?!
Abraços.

Aí é que está…

ele não retorna erro…

se eu não implementar isso de fazer aparecer mensagem quando um código já existe, ele cadastra normalmente…

mas se tento implementar isto, ele não cadastra +…

ele vai para a página que exibe os dados que foram cadastrados, porém não cadastra realmente…

Esqueci de falar…estou implementando este sistema em Servlet…[ñ sei se isso pode ajudar na resolução do problema…]

Thiago vc tera que usar um resultset e verificar se existe um cadastro no Banco se nao existir vc da um insert.

Everton, é justamente o que ele faz nesta linha

if(!rs.next()){ //insere }

Tente então ao invés de rs.next() assim rs.hasNext();

Abraços.

eu uso normalmente um while:

[code]while(rs.next()){

	rsTeste = true;
   
	Cliente cli = new Cliente();
    cli.setNome(rs.getString("nome"));
    cli.setCpf(rs.getString("cpf"));
    cli.setId(rs.getLong("id"));
    listaCliente.add(cli);
    	
   }[/code]

+/- assim…

Nel e Everton, agradeço por tentarem ajudar…

Nel, tentei aplicar o rs.hasNext(); mas o eclipse acusa erro…

Everton, tentei com o While, mas ficou na mesma situação…

cara posso estar errado e se estiver alguem me corrija, mas dentro do seu rs.next(), vc tem que comparar os nomes da sua coluna de cadastro. Como por exemplo:

rs.getString("nome").equals(objeto.getNome()) // exemplo

se tiver e for igual vc nao da insert se não da o insert…

Qual SGBD que você usa? Acho que se vc colocasse o atributo com índice UNIQUE te polparia muito trabalho…

Bom dia.

Concordo com o renamed, o próprio SGBD identificaria isso. Mas se quiser no Java, tente alterar sua lógica, da seguinte forma:

[code]
if (rs.next()) {
throw new Exception(“Conta já existe”);

}else {
String sql = “INSERT INTO ContaBancaria(Nome, Numero_Agencia, Numero_Conta, Saldo)” +
“VALUES (’”+nome+"’, ‘"+numero_agencia+"’, ‘"+numero_conta+"’, ‘0’)";
String extrato = “INSERT INTO Extrato(Numero_Agencia, Numero_Conta, Acao, Valor_Movimentado, Saldo_Atual)” +
“VALUES (’”+numero_agencia+"’, ‘"+numero_conta+"’, ‘Conta foi criada’, ‘0’, ‘0’)";
query.executeUpdate(sql);
query.executeUpdate(extrato);
} [/code]

Abraços.

Nel, infelizmente ainda não deu certo…

Renamed, utilizo o MySQL QUeryBrowser…

mas colocando em UNIQUE me surgiu uma duvida…

como é um sistema bancario, pode ter varias contas em um unica agencia…

se colocar UNIQUE em numero_agencia e/ou numero_conta, pode dar problema na hora de cadastrar uma nova conta em ua agencia diferente,e vice-versa…

por exemplo…

-Conta 1 na Agencia 1
-Conta 1 na Agencia 2 [aqui daria problema pq ja existiria uma conta “1”]
-Conta 2 na Agencia 1 [ o mesmo caso de cima…ja existiria uma Agencia “1” e não gravaria]

ou o q eu falei ali ñ tem nd haver??

Tentei seguir a dica do Everton…
fiz da seguinte forma…ñ sei se está certo…

[code]try{
MinhaConexao mc = new MinhaConexao();
Connection con = mc.getConexao();
Statement query = (Statement) con.createStatement();
PrintWriter out = response.getWriter();

		String select = "SELECT numero_agencia, numero_conta WHERE Numero_Agencia = '"+numero_agencia+"' AND Numero_Conta = '"+numero_conta+"'";
		
		ResultSet rs = query.executeQuery(select);
		
		rs.next();
			if (rs.getString("numero_agencia").equals(numero_agencia) && rs.getString("numero_conta").equals(numero_conta)){
				throw new Exception("Conta já existe");  		
			}
			else {   
				String sql = "INSERT INTO ContaBancaria(Nome, Numero_Agencia, Numero_Conta, Saldo)" +     
	            "VALUES ('"+nome+"', '"+numero_agencia+"', '"+numero_conta+"', '0')";     
	            String extrato = "INSERT INTO Extrato(Numero_Agencia, Numero_Conta, Acao, Valor_Movimentado, Saldo_Atual)" +     
	            "VALUES ('"+numero_agencia+"', '"+numero_conta+"', 'Conta foi criada', '0', '0')";     
	            query.executeUpdate(sql);     
	            query.executeUpdate(extrato);       
			}     
		
	} catch (MyClassException e){
		System.out.println("Mensagem: " + e.getMensagem());
		System.out.println("Mensagem Original: " + e.getMessage());
		System.out.println("Classe: " + e.getClasse());
		System.out.println("Método: " + e.getMetodo());[/code]

aconteceu a mesma coisa q com as outras tentativas…aparece como se tivesse gravado…mas ñ gravou…
mas desta vez, no console apareceu o seguinte erro…

Conta Bancaria
java.sql.SQLException: Illegal operation on empty result set.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:835)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5571)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5491)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5531)
at tr.ContaBancaria.Inserir(ContaBancaria.java:384)
at tr.ContaBancaria.doPost(ContaBancaria.java:105)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:875)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)

não sei o q pode ser…
ese erro apareceu quando eu coloquei uma conta q ñ existia ainda no banco…
quando coloquei uma conta igual, ao invés de “java.sql.SQLException: Illegal operation on empty result set.” apareceu “Conta já existe”
aos poucos o problema está se resolvendo…mas ainda não sei como resolver por completo…=\

É simples. Esta linha diz tudo: java.sql.SQLException: Illegal operation on empty result set.

Simplesmente seu select não encontrou ninguém no banco o que faz com que o seu result set seja vazio. Ele simplesmente está dizendo que você não pode realizar nenhum tipo de operação se o seu result set vem vazio.

faça apenas assim if(rs.next()) antes do if do equals ok?

Abraços.

Muito obrigado…

agora está aparecendo a mensagem, e quando não existe conta, ele cadastra normalmente…

finalmente terminei esse trabalho…

muito obrigado mesmo pessoal…

Funcionou o que eu falei Thiago?

Sim Everton…

me baseei naquilo que você falou…
daí deu um erro [por falha minha] e o Nel me mostrou onde estava o erro…
daí funcionou certinho

brigadão mesmo…

Fino de mais então, bons estudos, se precisar tamo ai!!!

vlw (Y)