É 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.
Já testei aqui até com outra coluna da tabela para ver se era alguma outra incompatibilidade… mas não deu certo
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?
rafaelglauber
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.
tandrade
O campo é de texto sim…
não entendi mto bem oq vc escreveu…
rafaelglauber
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();
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.
tandrade
coloquei um while para ele executar a busca nos registros… acho que ele não está saindo desse loop…
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…)
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.
Marck
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…
importjava.sql.*;importjavax.swing.*;publicclassTesteBd{privatePreparedStatementps;privateResultSetrs;publicConnectioncriaConexao(Stringusuario,Stringsenha)throwsClassNotFoundException,InstantiationException,SQLException,IllegalAccessException{Stringdsn="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/xxx/teste.mdb";Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();Connectioncon=DriverManager.getConnection(dsn,usuario,senha);returncon;}publicvoidverificaPosicao()throwsClassNotFoundException,InstantiationException,SQLException,IllegalAccessException{try{Connectionconn=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(SQLExceptionsqle){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!
tandrade
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.
Rafael, testei isso ai mas n deu certo tbm.
Ele não “executa” essas linhas, digamos assim, e vai direto pro catch()
rafaelglauber
Rafael, testei isso ai mas n deu certo tbm.
Ele não “executa” essas linhas, digamos assim, e vai direto pro catch()
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.
tandrade
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
tandrade
Achei a exceção!
java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY
rafaelglauber
em qual linha a exceção???
de qualquer forma uma melhorada aqui:
ps.setString(1, tf_obj1.getText());
ResultSet rs = ps.executeQuery();
rs.last();
int numberOfRows = rs.getRow();
st.close();
con.close();
if (numberOfRows != 0){
JOptionPane.showMessageDialog(null,"Posição Ocupada! \nSelecione outra posição!","Mensagem!",",JOptionPane.ERROR_MESSAGE);
tf_obj1.setText(null);
}else{
JOptionPane.showMessageDialogull,"PosiçãoDisponível!","Mensagem!",JOptionPane.INFORMATION_MESSAGE);
}
tandrade
Continua dando a mesma exceção.
Provavelmente la no ResultSet
Statementst=con.createStatement();PreparedStatementps=con.prepareStatement("SELECT * FROM OBJ WHERE DID1=?");ps.setString(1,tf_obj1.getText());ResultSetrs=ps.executeQuery();rs.next();while(rs.next()){JOptionPane.showMessageDialog(null,"Posição Ocupada! \nSelecione outra posição!","Mensagem!",JOptionPane.ERROR_MESSAGE);tf_obj1.setText(null);}JOptionPane.showMessageDialog(null,"Posição Disponível","Mensagem!",JOptionPane.INFORMATION_MESSAGE);st.close();con.close();
Nesse caso ai ele reconhece quando a posição está livre ou ocupada, porém quando ela está ocupada, após sair do while, ela também executa a outra JPanel rss
Quando a posição está livre ela não entra no while e executa corretamente o JPanel “Posição Disponível”
estamos quase lá
tandrade
Desse jeito melhorou um pouco:
Statementst=con.createStatement();PreparedStatementps=con.prepareStatement("SELECT * FROM OBJ WHERE DID1=?");ps.setString(1,tf_obj1.getText());ResultSetrs=ps.executeQuery();rs.next();while(rs.next()){JOptionPane.showMessageDialog(null,"Posição Ocupada! \nSelecione outra posição!","Mensagem!",JOptionPane.ERROR_MESSAGE);tf_obj1.setText(null);}JOptionPane.showMessageDialog(null,"Posição Disponível","Mensagem!",JOptionPane.INFORMATION_MESSAGE);st.close();con.close();
Nesse caso ai ele reconhece quando a posição está livre ou ocupada, porém quando ela está ocupada, após sair do while, ela também executa a outra JPanel rss
Quando a posição está livre ela não entra no while e executa corretamente o JPanel “Posição Disponível”
estamos quase lá
rafaelglauber
ps.setString(1, tf_obj1.getText());
ResultSet rs = ps.executeQuery();
int numberOfRows = 0;
while(rs.next()){
numberOfRows++;
}
st.close();
con.close();
if (numberOfRows != 0){
JOptionPane.showMessageDialog(null,"Posição Ocupada! \nSelecione outra posição!","Mensagem!",",JOptionPane.ERROR_MESSAGE);
tf_obj1.setText(null);
}else{
JOptionPane.showMessageDialogull,"PosiçãoDisponível!","Mensagem!",JOptionPane.INFORMATION_MESSAGE);
}
tandrade
AEEEEEEEEEEEEEE DEU CERTOO!! :)))
Muito obrigado companheiro, aprendi muito nesse tópico
Grande abraço e obrigado novamente.
:D:D
tandrade
uhhhuuuuu!! 2 dias quebrando cabeça hahahaha
valeu mesmo!