Consulta em ACCESS

Pessoal, me ajudem com esse código aqui.

É o seguinte, estou obtendo um valor através de um textfield e gostaria de buscar esse valor em uma coluna da minha tabela. Caso, já tenha um registro igual na tabela gostaria q ele retornasse uma mensagem negando um novo cadastro, caso contrário, permitindo.

Fiz um código mas ele n está funcionando direito pois só mostra que o cadastro está habilitado mesmo eu já tendo um registro na tabela.

Segue o código:

        try {
            String dsn     = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/xxx/teste.mdb";
            String usuario = "";
            String senha   = "";
            String sql     = "";
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
            Connection con = DriverManager.getConnection(dsn,usuario,senha);
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM OBJ WHERE DID1="+tf_obj1.getText());
            rs.next();
            JOptionPane.showMessageDialog(null,"Posição Ocupada! \nSelecione outra posição!","Mensagem!",",JOptionPane.ERROR_MESSAGE);
            st.close();
            con.close();
        } catch(Exception event)JOptionPane.showMessageDialogull,"PosiçãoDisponível!","Mensagem!",JOptionPane.INFORMATION_MESSAGE);
        }

Oi??

Já testei aqui até com outra coluna da tabela para ver se era alguma outra incompatibilidade… mas não deu certo :confused:

Creio que ele não está realizando a consulta direito pois sempre está chamando o “catch”… ou seja, tudo que tem ali depois da consulta ele não está “enxergando”

alguém pode ajudar?

A coluna “DID1” é que tipo de dado? Texto? de qualquer forma use parametros (?) para passar o valor do texto, exemplo:

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 153833.00) pstmt.setInt(2, 110592)

utilizando é claro o tipo adequado.

O campo é de texto sim…

não entendi mto bem oq vc escreveu…

substitua isso:

Statement st = con.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM OBJ WHERE DID1="+tf_obj1.getText());

por isso:

Statement st = con.createStatement(); st.prepareStatement("SELECT * FROM OBJ WHERE DID1=?"); st.setString(1, tf_obj1.getText()); ResultSet rs = st.executeQuery();

dê uma lida aqui na documentação.

Opa!

Substitui as linhas do código que você postou porém deu erro nas três linhas!

cannot find symbol
symbol : method prepareStatement(java.lang.String)
location: interface java.sql.Statement
st.prepareStatement(“SELECT * FROM OBJ WHERE DID1=?”);

cannot find symbol
symbol : method setString(int,java.lang.String)
location: interface java.sql.Statement
st.setString(1, tf_obj1.getText());

executeQuery(java.lang.String) in java.sql.Statement cannot be applied to ()
ResultSet rs = st.executeQuery();
3 errors

Sendo que importei:

import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

Alguém pode me ajudar? =//

corrigindo:

PreparedStatement ps = con.prepareStatement("SELECT * FROM OBJ WHERE DID1=?"); ps.setString(1, tf_obj1.getText()); ResultSet rs = ps.executeQuery();

:smiley:

hum… agora não ta entrando no catch()

o código deu certo mas quando é p entrar no catch ele não está exibindo o JOptionPane…

catch(Exception event){
JOptionPane.showMessageDialogull,"PosiçãoDisponível!","Mensagem!",JOptionPane.INFORMATION_MESSAGE);   
}  

Mude a lógica do programa, não use uma exception para testar uma condição…faça esse teste com lógica, verifique se o retorno da query é nula, ou se retorna dados e dessa forma construa sua lógica, evite usar tratamento de exceção como controle de fluxo de seu programa.

coloquei um while para ele executar a busca nos registros… acho que ele não está saindo desse loop…

            while(rs.next())
            {
            JOptionPane.showMessageDialog(null,"Posição Ocupada ","ERRO!",JOptionPane.ERROR_MESSAGE);
            }

mas teoricamente n era pra dar certo?

Estou usando o catch tbm justamente pq para conectar ao bd eu preciso de um bloco try… dai tenho o catch como forma de tratar os eventos.
tentei utilizar umas condições aqui mas continua dando o mesmo problema.

O programa detecta corretamente quando a posição inserida pelo usuário está ocupada, porém não mostra nada quando essa posição está livre! (o catch que deveria fazer isso teoricamente rs…)

coloca ai como ficou o fonte

Segue:

try {   
            String dsn     = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/xxx/teste.mdb";   
            String usuario = "";   
            String senha   = "";   
            String sql     = "";   
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();   
            Connection con = DriverManager.getConnection(dsn,usuario,senha);   
            Statement st = con.createStatement();   
            PreparedStatement ps = con.prepareStatement("SELECT * FROM OBJ WHERE DID1=?");
            ps.setString(1, tf_obj1.getText());
            ResultSet rs = ps.executeQuery();
            while(rs.next())
            {
            JOptionPane.showMessageDialog(null,"Posição Ocupada! \nSelecione outra posição!","Mensagem!",",JOptionPane.ERROR_MESSAGE);   
            tf_obj1.setText(null);
            //até aqui tudo bem, ele seta para null o campo de texo.
            }    
            st.close();   
            con.close();   
    } 
   catch(Exception event){ JOptionPane.showMessageDialogull,"PosiçãoDisponível!","Mensagem!",JOptionPane.INFORMATION_MESSAGE);   
}  

Veja seu eu entendi bem, vc quer mostrar uma mensagem de indiponível se localizar no banco de dados e outra de disponível se não localizar.

veja se isso atende:

ps.setString(1, tf_obj1.getText()); ResultSet rs = ps.executeQuery(); rs.last(); int numberOfRows = rs.getRow(); if (numberOfRows != 0){ while(rs.next()){ JOptionPane.showMessageDialog(null,"Posição Ocupada! \nSelecione outra posição!","Mensagem!",",JOptionPane.ERROR_MESSAGE); tf_obj1.setText(null); //até aqui tudo bem, ele seta para null o campo de texo. } }else{ JOptionPane.showMessageDialogull,"PosiçãoDisponível!","Mensagem!",JOptionPane.INFORMATION_MESSAGE); } st.close(); con.close();

ps. não testei o código, pode ser que precise de algum ajuste.

Opá…blza?

Acho q entendi o que vc quer…fiz uma alteração na classe, só não consegui testar…mas vê se te ajuda…

import java.sql.*;
import javax.swing.*;

public class TesteBd {

	private PreparedStatement ps;
	private ResultSet         rs;    
    
    public Connection criaConexao(String usuario, String senha) throws ClassNotFoundException, InstantiationException, 
    																   SQLException          , IllegalAccessException{
    	
    	
    	  String dsn     = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/xxx/teste.mdb";     
          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();     
          Connection con = DriverManager.getConnection(dsn,usuario,senha);     
    	
    	return con;
    }
    
    
    
    
    public void verificaPosicao() throws ClassNotFoundException, InstantiationException, 
    									 SQLException          , IllegalAccessException {
    
     		try {     
             	
             	Connection conn = criaConexao("usuario", "senha");
             	ps = conn.prepareStatement("SELECT * FROM OBJ WHERE DID1=?");  
             	//ps.setString(1, tf_obj1.getText());  
             	rs = ps.executeQuery();  
             
             	do {
             		
             		if ( !rs.next() ){
             			
             			JOptionPane.showMessageDialog(null,"PosiçãoDisponível!","Mensagem!",JOptionPane.INFORMATION_MESSAGE);     
             		}else{
             			
             			JOptionPane.showMessageDialog( null,"Posição Ocupada! \nSelecione outra posição!", "Mensagem!", JOptionPane.ERROR_MESSAGE);
             		}
             		//tf_obj1.setText(null);  
             		
             	}
             	while(rs.next());
             	
     		}catch(SQLException sqle){
     		
     			sqle.printStackTrace();
     				
 	  		} finally{
 	  			
 	  			ps.close();     
             	rs.close();    
 	  		}
    
	}
}

O Posicão disponivel não é uma excecao. Acho que assim fica mais fácil de entender seu código.
abraço!

[quote=rafaelglauber]Veja seu eu entendi bem, vc quer mostrar uma mensagem de indiponível se localizar no banco de dados e outra de disponível se não localizar.

veja se isso atende:

ps.setString(1, tf_obj1.getText()); ResultSet rs = ps.executeQuery(); rs.last(); int numberOfRows = rs.getRow(); if (numberOfRows != 0){ while(rs.next()){ JOptionPane.showMessageDialog(null,"Posição Ocupada! \nSelecione outra posição!","Mensagem!",",JOptionPane.ERROR_MESSAGE); tf_obj1.setText(null); //até aqui tudo bem, ele seta para null o campo de texo. } }else{ JOptionPane.showMessageDialogull,"PosiçãoDisponível!","Mensagem!",JOptionPane.INFORMATION_MESSAGE); } st.close(); con.close();

ps. não testei o código, pode ser que precise de algum ajuste.[/quote]

Rafael, testei isso ai mas n deu certo tbm.
Ele não “executa” essas linhas, digamos assim, e vai direto pro catch()

[quote] Rafael, testei isso ai mas n deu certo tbm.
Ele não “executa” essas linhas, digamos assim, e vai direto pro catch()[/quote]

Se ele vai “direto” para catch então tá ocorrendo alguma exceção, pode coloca-la aqui para vermos?

ps. coloque um break-point no inicio do código e utilizando sua IDE verifique o que tá ocorrendo, tá faltando pequenos ajuste no código para seu problema ser resolvido, um pouco de esforço e terá seu resultado.

Marck, testei o seu também e não funcionou, no seu caso, o programa me exibiu a mesma mensagem, tanto para disponível quanto para indisponível