Senhores!!!
Estou tentando criar uma classe só para conexão e possivelmente para recordset com retorno porém isso está me dando uma série de dores de cabeça e erros não entendo o que está acontecendo e gostaria de uma ajuda dos universitários :D.
Estou chamando ela nas outras classes dessa forma:
ConexaoBanco conecta = new ConexaoBanco();
PreparedStatement psmt = conecta.con.prepareStatement("SELECT COUNT(*) AS Total FROM Usuarios WHERE Usuario = '" + usuario + "' AND Senha = '" + senha + "'" );
System.out.println("SELECT COUNT(*) AS Total FROM Usuarios WHERE Usuario = '" + usuario + "' AND Senha = '" + senha + "'" );
ResultSet rs = psmt.executeQuery();
rs.next();
System.out.println(rs.getString("Total"));
conecta.con.close();
rs.close();
Aqui está a classe de conexão:
[code]
package Estudo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
/**
*
-
@author Celso José Pereira
*/
public class ConexaoBanco {
Connection con = null;
public Connection conecta(){
try{
String fonte = "jdbc:postgresql://localhost:5432/Testes";
String usuario = "celsojp";
String senha = "senha";
Class.forName("org.postgresql.Driver");
con = DriverManager.getConnection(fonte,usuario,senha);
}
catch(ClassNotFoundException e){
JOptionPane.showMessageDialog(null, "Erro em ClassNotFoundException: " + e.getMessage());
}
catch(SQLException e){
JOptionPane.showMessageDialog(null, "Erro em SQLException: " + e.getMessage());
}
catch(NoClassDefFoundError e){
JOptionPane.showMessageDialog(null, "Erro em NoClassDefFoundError: " + e.getMessage());
}
return con;
}
} [/code]
Um Grande Abraço!!!
Sem dizer quais são os erros é dificil ajudar.
Algumas coisas que vc pode melhorar
- Não use Comunicação com o usuário dentro de um catch a menos que a classe seja a ultima na hierarquia ( ou seja, ou passa para o usuário ou vai para a JVM) . Use exceções especificas agrupadas numa exção maior como DataSourceException ou DataBaseConnectionException.
- Use try/catch durante a execução do processo. Use finally para fechar a conexão. Ele tem que se ser fechada independentemente se houve erro ou não.
- Não use Connexção.con.prepared crie um método onde vc passa o SQL e internamente é criado statement. Vc não pode usar um statement estático porque quando a conexõ é fechada o statement tb é.
- Se usa PreparedStamentment não coloque os valores directamente no SQL. Veja o javadoc de PReparedStatement para mais informações.
Você poderia fazer um construtor com parâmetros para que possa alterar o host, login e senha de sua conexão…
um sem nada seria bom também, assim você usaria os sets para criar uma conexão!
[quote=sergiotaborda]Sem dizer quais são os erros é dificil ajudar.
Algumas coisas que vc pode melhorar
- Não use Comunicação com o usuário dentro de um catch a menos que a classe seja a ultima na hierarquia ( ou seja, ou passa para o usuário ou vai para a JVM) . Use exceções especificas agrupadas numa exção maior como DataSourceException ou DataBaseConnectionException.
- Use try/catch durante a execução do processo. Use finally para fechar a conexão. Ele tem que se ser fechada independentemente se houve erro ou não.
- Não use Connexção.con.prepared crie um método onde vc passa o SQL e internamente é criado statement. Vc não pode usar um statement estático porque quando a conexõ é fechada o statement tb é.
- Se usa PreparedStamentment não coloque os valores directamente no SQL. Veja o javadoc de PReparedStatement para mais informações.
[/quote]
Bom dia Sergio!!!
Primeiramente Agradeço pela sua ajuda.
Resolvi retornar o recordset pra variar e funcionou, acho que estou pensando de forma muito estruturada ainda rs!!!
Não entendi o 1º e o 4º itens se puder ser um pouco mais específico eu agradeceria más, consegui resolver o problema olha como ficou o código:
Chamada:
Shared recursosCompartilhados = new Shared();
ResultSet resultado =null;
try {
String sqlBuscaUser = "SELECT COUNT(*) AS Total FROM Usuarios WHERE Usuario = '" + usuario + "' AND Senha = '" + senha + "'";
resultado = recursosCompartilhados.conecta(sqlBuscaUser);
resultado.next();
System.out.println(resultado.getInt("Total"));
if(resultado.getInt("Total")==1){
JOptionPane.showMessageDialog(null,"Logou");
}else{
JOptionPane.showMessageDialog(null,"Nome de Usuário e/ou Senha Incorretos!","Informação de Login",JOptionPane.ERROR_MESSAGE);
}
}catch (SQLException ex) {
Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
}
Função:
private ResultSet rs = null;
private Connection con = null;
public ResultSet conecta(String sql) throws SQLException{
try{
String fonte = "jdbc:postgresql://localhost:5432/Testes";
String usuario = "celsojp";
String senha = "senhazinha";
Class.forName("org.postgresql.Driver");
con = DriverManager.getConnection(fonte,usuario,senha);
PreparedStatement psmt = con.prepareStatement(sql);
rs = psmt.executeQuery();
}
catch(ClassNotFoundException e){
JOptionPane.showMessageDialog(null, "Erro em ClassNotFoundException: " + e.getMessage());
}
catch(SQLException e){
JOptionPane.showMessageDialog(null, "Erro em SQLException: " + e.getMessage());
}
catch(NoClassDefFoundError e){
JOptionPane.showMessageDialog(null, "Erro em NoClassDefFoundError: " + e.getMessage());
}
finally{
con.close();
}
return rs;
}
Um grande Abraço!!!
[quote=julianofischer]Você poderia fazer um construtor com parâmetros para que possa alterar o host, login e senha de sua conexão…
um sem nada seria bom também, assim você usaria os sets para criar uma conexão![/quote]
Bom dia Juliano tudo bem?
Na verdade host, login e senha são padrões mesmo, vai acessar um único banco somente. Já o bom e velho sql é o que muda com água rs…
Postei a função logo acima, não consigo fechar o rs dessa forma mas a conexão fica padrão.
Um grande abraço!!!
Tudo bem Neo (posso chamá-lo assim certo?)…
Mas já que java está muito ligada a reaproveitamento de código, você poderia criar a classe da maneira que eu lhe disse para que possa utilizá-la em outras conexões sem ter de alterar a classe para cada nova conexão!
