Problemas com PreparedStatement

13 respostas
M

Bom dia pessoal, eu tô com um probleminha no SQL Server e PreparedStatement.
É apenas uma classe de login e senha mas nunca retorna nada a menos que eu passe os parâmetros de login e senha diretamente na String SQL. Eu não sei o que tem de errado ai, acho que é algo na String SQL mas eu não consigo achar o que exatamente.

Enfim vou postar aqui minhas classes.

UsuarioData
public class UsuarioData extends Conexao{
    /**
     * Método responsável obter o Id de uma Pessoa pelo Login e Senha
     * @param Login Login da Pessoa
     * @param Senha Senha da Pessoa
     * @return Dados do Usuário
     */
    public UsuarioBean Obtem(String Login, String Senha){
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        String SQL = "SELECT Usuarios.IdPessoa IdPessoa, Usuarios.NomeUsuario NomeUsuario, Pessoas.Nome Nome " +
                "FROM Pessoas INNER JOIN Usuarios ON Usuarios.IdPessoa = Pessoas.IdPessoa " +
                "WHERE NomeUsuario LIKE ? AND Usuarios.Senha LIKE ?";

        try{
            pstmt = openConnection().prepareStatement(SQL);

            pstmt.setString(1,Login);
            pstmt.setString(2,Senha);

            rs = pstmt.executeQuery();

            if(rs.next()){
                UsuarioBean bean = new UsuarioBean();

                bean.setIdPessoa(rs.getInt("IdPessoa"));
                bean.setNomeUsuario(rs.getString("NomeUsuario"));
				bean.setNome(rs.getString("Nome"));

                return bean;
            }
        }catch(Exception ex){
            ex.getMessage();
        }finally{
            closeConnection();
        }
        return null;
    }
}
UsuarioBean:
public class UsuarioBean {
    //<editor-fold desc="Atributos">
    private int IdPessoa;
	private String NomeUsuario;
	private String Senha;
	private String Nome;
    //</editor-fold>

    //<editor-fold desc="Metodos get/set">
    /**
     * @return the IdPessoa
     */
    public int getIdPessoa() {
        return IdPessoa;
    }

    /**
     * @param IdPessoa the IdPessoa to set
     */
    public void setIdPessoa(int IdPessoa) {
        this.IdPessoa = IdPessoa;
    }

    /**
     * @return the NomeUsuario
     */
    public String getNomeUsuario() {
        return NomeUsuario;
    }

    /**
     * @param NomeUsuario the NomeUsuario to set
     */
    public void setNomeUsuario(String NomeUsuario) {
        this.NomeUsuario = NomeUsuario;
    }

    /**
     * @return the Senha
     */
    public String getSenha() {
        return Senha;
    }

    /**
     * @param Senha the Senha to set
     */
    public void setSenha(String Senha) {
        this.Senha = Senha;
    }

    /**
     * @return the Nome
     */
    public String getNome() {
        return Nome;
    }

    /**
     * @param Nome the Nome to set
     */
    public void setNome(String Nome) {
        this.Nome = Nome;
    }
    //</editor-fold>
}
Conexao:
public class Conexao {

    // <editor-fold desc="Atributos">
    private Connection conexao = null;
    // </editor-fold>

    // <editor-fold desc="Construtor">
    public Conexao()
    {

    }
    // </editor-fold>

    // <editor-fold desc="Métodos Públicos">
    /**
     * Método responsável por abrir a conexão com o BD
     * @return Conexão com o BD
     */
    public Connection openConnection(){
        try{
            // define o driver JDBC do banco de dados:
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

            String url = "jdbc:odbc:meubd";
            conexao = DriverManager.getConnection(url);
        }catch(Exception ex){
            ex.getMessage();
        }
        return conexao;
    }

    /**
     * Método responsável por fechar a conexão com o BD
     */
    public void closeConnection(){
        try{
            conexao.close();
        }catch(Exception ex){
            ex.getMessage();
        }
    }
    // </editor-fold>
}

13 Respostas

M

Bom dia amigão,

só uma pergunta, o codigo retorna algum erro?, ou simplemente não retorna nada?

porque a passagem de paramentros esta correta.

valew

M

Não dá erro algum.
Hora que passa pelo if(rs.next()) é como se não encontrasse o registro e sai do método. Eu testo diretamente no SQL Server passando os mesmos parâmetros e encontra o registro, mas pelo java não encontra a menos que eu passe diretamente os parâmetros na string SQL.

maschiojv

Será que não está faltando % no seu like?

M

creio que não, como é um sistema de login eu tenho que pegar o registro exatamente igual ao parâmetro, se eu por % ele vai pegar qualquer registro parecido, por exemplo, usando % e digitar usuario: mar senha: 123 o sistema vai me retornar todos os registros que tenham mar no usuário e 123 na senha, por exemplo

marcelo, 123afd
marcos, 123mma
mario, 123asd

e assim por diante, ou estou equivocado?

T

Não use LIKE para usuário e senha. Imagine se o cara digita “%%” para o usuário e senha; então QUALQUER usuário será validado, inclusive o tal hackeer ou cracker que vai destruir seu sistema. Insista no uso de “=”, NUNCA NUNCA NUNCA o LIKE.

M

thingol:
Não use LIKE para usuário e senha. Imagine se o cara digita “%%” para o usuário e senha; então QUALQUER usuário será validado, inclusive o tal hackeer ou cracker que vai destruir seu sistema. Insista no uso de “=”, NUNCA NUNCA NUNCA o LIKE.

mas no SQL Server não da pra usar = em comparações de String, ou dá?! Se dá, eu não sei como fazer ^^

T

E mais uma coisa: por motivos de segurança, evite informar o usuário que “a senha está incorreta”, se o usuário for encontrado no sistema mas a senha não.

O correto é barrar o acesso sempre, e sempre com a mesma mensagem “usuário e/ou senha estão incorretos”, porque aí alguém que quiser entrar indevidamente não poderá nem “chutar” a senha de um usuário existente, já que ele não vai conseguir achar nem um nome de usuário.

maschiojv

thingol:
Não use LIKE para usuário e senha. Imagine se o cara digita “%%” para o usuário e senha; então QUALQUER usuário será validado, inclusive o tal hackeer ou cracker que vai destruir seu sistema. Insista no uso de “=”, NUNCA NUNCA NUNCA o LIKE.

mas ele está usando prepareStatment, ele já não é seguro contra sql injection?

M

thingol:
E mais uma coisa: por motivos de segurança, evite informar o usuário que “a senha está incorreta”, se o usuário for encontrado no sistema mas a senha não.

O correto é barrar o acesso sempre, e sempre com a mesma mensagem “usuário e/ou senha estão incorretos”, porque aí alguém que quiser entrar indevidamente não poderá nem “chutar” a senha de um usuário existente, já que ele não vai conseguir achar nem um nome de usuário.


:slight_smile:

Quanto a usar = ao invés de LIKE eu recebo a seguinte mensagem:

Os tipos de dados text e varchar são incompatíveis no operador equal to.
T

markin1:
thingol:
Não use LIKE para usuário e senha. Imagine se o cara digita “%%” para o usuário e senha; então QUALQUER usuário será validado, inclusive o tal hackeer ou cracker que vai destruir seu sistema. Insista no uso de “=”, NUNCA NUNCA NUNCA o LIKE.

mas no SQL Server não da pra usar = em comparações de String, ou dá?! Se dá, eu não sei como fazer ^^

É claro que dá, afinal de contas SQL Server não é Java e ele não usa “EQUALS” e sim “=”.

maschiojv

temte colocar um trim nas suas comparações, trim(usuario) LIKE trim (?), o problema pode ser que no banco tem espaços em branco sobrando, tive um problema desses uns dias a traz. :?

T

[quote=markin1]

thingol:
E mais uma coisa: por motivos de segurança, evite informar o usuário que “a senha está incorreta”, se o usuário for encontrado no sistema mas a senha não.

O correto é barrar o acesso sempre, e sempre com a mesma mensagem “usuário e/ou senha estão incorretos”, porque aí alguém que quiser entrar indevidamente não poderá nem “chutar” a senha de um usuário existente, já que ele não vai conseguir achar nem um nome de usuário.


:slight_smile:

Quanto a usar = ao invés de LIKE eu recebo a seguinte mensagem:

Os tipos de dados text e varchar são incompatíveis no operador equal to.

Qual é o tipo dos dados dessas colunas? A coluna (usuário ou senha, não sei qual delas), se estou pensando bem, está cadastrada com tipo errado . O uso do tipo “text” em SQL Server só deve ser feito se você precisar de pôr uma quantidade de dados grande, como um documento; não um nome de usuário ou uma senha, que são coisas pequenas. Mude para “varchar”.

M

Demorei mas voltei ^^
Realmente o problema estava no tipo de dados, o campo senha estava como text, mudei pra varchar e substitui o LIKE por = na String SQL agora tá funcionando direitinho.

Agradeço a todo mundo ai que deu uma ajuda.

Criado 13 de fevereiro de 2009
Ultima resposta 13 de fev. de 2009
Respostas 13
Participantes 4