Maldito Statement, onde você está?

20 respostas
H

Olá a todos.

O tópico é auto-explicado mas vamos lá.

Estou bolando um programa para desktop e restava somente o uso de login/senha. Achei aqui pelo fórum um post que me ensinou direitinho como fazer.
Infelizmente, quando uso Statement() ou createStatement() ou qualquer similar, ele simplesmente diz que o método não existe e que eu tenho que criá-lo.

Como posso resolver o problema?
Obrigado.

20 Respostas

Hebert_Coelho

Que tal adicionar a biblioteca necessária? O.o

Como está seu código?

Posta apenas a parte do statement.

H

jakefrog:
Que tal adicionar a biblioteca necessária? O.o

Como está seu código?

Posta apenas a parte do statement.

Qual a biblioteca dele? Estou usando somente a do postgres.

Aqui o comando que estou tentando fazer (ta só no começo):

final String query = "Select login from acesso where login = "+ jTextField1.getText() + "'"; ResultSet rs = con.createStatement().executeQuery (query);

Hebert_Coelho

Cara, tem alguma coisa errada nesse teu projeto.

Estava olhando aqui, o java.sql.PreparedStatement; por exemplo já está incluso no java. O.o

Qual a mensagem de erro que dá?

H

jakefrog:
Cara, tem alguma coisa errada nesse teu projeto.

Estava olhando aqui, o java.sql.PreparedStatement; por exemplo já está incluso no java. O.o

Qual a mensagem de erro que dá?

É isso que eu tambem nao entendo cara.
Era pra tar rodando.

Ele só manda uma mensagem dizendo que eu preciso criar o método Statement ou createStatement ou qualquer outro.
E eu já dei import no java.sql.PreparedStatement. :cry:

A

henriquez1m:
Ele só manda uma mensagem dizendo que eu preciso criar o método Statement ou createStatement ou qualquer outro.
E eu já dei import no java.sql.PreparedStatement. :cry:

Se possível cole aqui exatamente a mensagem de erro que está dando.

Seu código está assim:

ResultSet rs =  con.createStatement().executeQuery (query);

Mas de onde vem esse objeto con?
Ele é realmente um Connection ?

H
AbelBueno:
henriquez1m:
Ele só manda uma mensagem dizendo que eu preciso criar o método Statement ou createStatement ou qualquer outro. E eu já dei import no java.sql.PreparedStatement. :cry:

Se possível cole aqui exatamente a mensagem de erro que está dando.

Seu código está assim:

ResultSet rs =  con.createStatement().executeQuery (query);

Mas de onde vem esse objeto con?
Ele é realmente um Connection ?

con é da classe Conexao, segue aqui o codigo:
import java.sql.*;
import javax.swing.JOptionPane;

public class Conexao
{
final static private String driver = "org.postgresql.Driver";
final static private String url = "jdbc:postgresql://localhost/sick";
final static private String usuario = "postgres";
final static private String senha = "123abc";
public static Connection conexao;
public static Statement statement;
public static ResultSet resultset;

public static boolean conecta() throws SQLException
    {
      boolean result = true;
      try
      {
          Class.forName(driver);
          conexao = (Connection) DriverManager.getConnection(url, usuario, senha);
          //JOptionPane.showMessageDialog(null, "Conectou!!!");
      }
      catch(ClassNotFoundException Driver)
      {
          JOptionPane.showMessageDialog(null, "Driver nao localizado: "+Driver);
          result = false;
      }
      catch (SQLException Fonte)
      {
          JOptionPane.showMessageDialog(null, "Deu erro na conexão "+
                  "com a fonte de dados: "+Fonte);
          result = false;
      }
      return result;
    }
public void desconecta()
    {
      boolean result = true;
      try
      {
      conexao.close();
      JOptionPane.showMessageDialog(null, "Banco fechado");
      }
    catch (SQLException fecha)
    {
    JOptionPane.showMessageDialog(null, "Não foi possivel "+
            "fechar o banco de dados: "+fecha);
    result = false;
    }
   }
   public void executeSQL(String sql)
    {
    try
    {
        statement = (Statement) conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
        resultset = statement.executeQuery(sql);
    }
    catch (SQLException sqlex)
    {
        JOptionPane.showMessageDialog(null, "nao foi possivel "+
                "executar o comando sql,"+sqlex+", o sql passado foi "+sql);
    }
    }
 }
ViniGodoy

Tem muita coisa errada no seu código:

a) Statement e ResultSet não deveriam ser variáveis globais, e sim, locais e declaradas nos métodos onde forem usadas;

b) Você não precisa dos casts das linhas 20 e 55. O método getConnection do DriverManager  retorna um Connection e o createStatement da conexao  retorna um Statement;

c) Está faltando fechar o ResultSet e o Statement;

d) Certifique-se de importar java.sql.<em>, e nunca algum pacote específico de banco de dados (tal como org.postgresql.</em>);

Seria muito bom se você postasse exatamente a mensagem de erro que está obtendo durante a compilação.

H

ViniGodoy:
Tem muita coisa errada no seu código:

a) Statement e ResultSet não deveriam ser variáveis globais, e sim, locais e declaradas nos métodos onde forem usadas;

b) Você não precisa dos casts das linhas 20 e 55. O método getConnection do DriverManager  retorna um Connection e o createStatement da conexao  retorna um Statement;

c) Está faltando fechar o ResultSet e o Statement;

d) Certifique-se de importar java.sql.<em>, e nunca algum pacote específico de banco de dados (tal como org.postgresql.</em>);

Seria muito bom se você postasse exatamente a mensagem de erro que está obtendo durante a compilação.

cannot find symbol
symbol: method createStatement()
location: variable con of type sick.adicionar.dados.Conexao

E para resolver o problema ele pede para eu criar o método createStatement() em sick.adicionar.dados.Conexao.

Ataxexe

henriquez1m:
ViniGodoy:
Tem muita coisa errada no seu código:

a) Statement e ResultSet não deveriam ser variáveis globais, e sim, locais e declaradas nos métodos onde forem usadas;

b) Você não precisa dos casts das linhas 20 e 55. O método getConnection do DriverManager  retorna um Connection e o createStatement da conexao  retorna um Statement;

c) Está faltando fechar o ResultSet e o Statement;

d) Certifique-se de importar java.sql.<em>, e nunca algum pacote específico de banco de dados (tal como org.postgresql.</em>);

Seria muito bom se você postasse exatamente a mensagem de erro que está obtendo durante a compilação.

cannot find symbol
symbol: method createStatement()
location: variable con of type sick.adicionar.dados.Conexao

E para resolver o problema ele pede para eu criar o método createStatement() em sick.adicionar.dados.Conexao.

Mas é exatamente isso que você precisa fazer. Como você quer chamar um método que não existe? Sua classe sick.adicionar.dados.Conexao não declara nenhum método createStatement.

ViniGodoy

Na classe que você postou, não tem a linha con.createStatement.
Então, esse erro está em outro lugar.

Se você está usando a classe Conexao, você deveria usar o con.executeSql, método que você mesmo criou.

H

ViniGodoy:
Na classe que você postou, não tem a linha con.createStatement.
Então, esse erro está em outro lugar.

Se você está usando a classe Conexao, você deveria usar o con.executeSql, método que você mesmo criou.

Como eu deveria mudar meu projeto para poder usar o Statement?

H

Alguem tem idéia do que eu deveria fazer para poder usar o Statement?

pmlm

O teu problema não é no código que postaste mas em outro lado… Em algum sitio tens uma variável con que é do tipo Conexao e onde estás a tentar invocar o método createStatement mas a tua classe Conexao não tem esse método.

H

E qual classe que tem esse metodo?

wagnerfrancisco

Pelo que entendi do seu código, no lugar que você faz isso:

final String query = "Select login from acesso where login = "+ jTextField1.getText() + "'";
        ResultSet rs =  con.createStatement().executeQuery (query);

Você deveria estar utilizando a classe Conexao e o método executeSQL. Mas você ainda teria problemas com o ResultSet, que tá global e não deveria como o vini falou. Bota o código que contém esse trecho acima para nós vermos.

H
wagnerfrancisco:
Pelo que entendi do seu código, no lugar que você faz isso:
final String query = "Select login from acesso where login = "+ jTextField1.getText() + "'";
        ResultSet rs =  con.createStatement().executeQuery (query);

Você deveria estar utilizando a classe Conexao e o método executeSQL. Mas você ainda teria problemas com o ResultSet, que tá global e não deveria como o vini falou. Bota o código que contém esse trecho acima para nós vermos.

package sick.adicionar.dados;

import java.sql.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;

/**
 *
 * @author Carlos
 */

public class Acesso extends javax.swing.JFrame {
    
    /**
     * Creates new form Acesso
     */
    public Acesso() throws SQLException {
       Conexao con;
       con = new Conexao();
       Conexao.conecta();
       con.executeSQL("select * from acesso");
       this.setLocationRelativeTo(null);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();
        texto_painel = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jSeparator2 = new javax.swing.JSeparator();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jTextField2 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        jLabel1.setText("Entre com o Login/Senha da empresa para ter acesso ao");

        texto_painel.setFont(new java.awt.Font("Tahoma", 0, 30)); // NOI18N
        texto_painel.setForeground(new java.awt.Color(0, 0, 153));
        texto_painel.setText("Painel de Similaridades");

        jLabel2.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        jLabel2.setText("sistema. Não será possível adicionar novos produtos sem");

        jLabel3.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        jLabel3.setText("esse acesso.");

        jLabel4.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        jLabel4.setText("Login:");

        jLabel5.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        jLabel5.setText("Senha:");

        jTextField1.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N

        jTextField2.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N

        jButton1.setText("Conectar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("Sair");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addGroup(layout.createSequentialGroup()
                                            .addGap(17, 17, 17)
                                            .addComponent(texto_painel))
                                        .addGroup(layout.createSequentialGroup()
                                            .addGap(10, 10, 10)
                                            .addComponent(jLabel1)))
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(jLabel3)
                                        .addComponent(jLabel2)))
                                .addGap(0, 0, Short.MAX_VALUE))
                            .addComponent(jSeparator2))
                        .addGap(14, 14, 14))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel5)
                            .addComponent(jLabel4))
                        .addGap(18, 18, 18)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jTextField1)
                            .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 221, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(0, 0, Short.MAX_VALUE))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(texto_painel, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel3)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jSeparator2, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel4)
                            .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel5)
                            .addComponent(jButton2)))
                    .addComponent(jButton1))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
    }                                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        Conexao con;
        con = new Conexao();
final String query = "Select * from acesso where login = "+ jTextField1.getText() + "'";
        ResultSet rs =  con.createStatement().executeQuery (query);        
        JOptionPane.showMessageDialog(null, "Você se conectou ao Banco de Dados com sucesso!");
    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Acesso.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Acesso.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Acesso.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Acesso.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Acesso().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField2;
    private javax.swing.JLabel texto_painel;
    // End of variables declaration
pmlm

henriquez1m:

Conexao con; con = new Conexao(); final String query = "Select * from acesso where login = "+ jTextField1.getText() + "'"; ResultSet rs = con.createStatement().executeQuery (query);

Aqui está o teu problema. Conexao é uma classe tua e não tem nenhum método createStatement.

De acordo com o teu código anterior (não me parece ser a melhor forma de fazer, mas um problema de cada vez), o que deverias ter ai era algo como:

Conexao con = new Conexao();
con.conecta();
final String query = "Select * from acesso where login = "+ jTextField1.getText() + "'";
con.executeSQL(query);        
ResultSet rs = con.resultset;
H

pmlm:
henriquez1m:

Conexao con; con = new Conexao(); final String query = "Select * from acesso where login = "+ jTextField1.getText() + "'"; ResultSet rs = con.createStatement().executeQuery (query);

Aqui está o teu problema. Conexao é uma classe tua e não tem nenhum método createStatement.

De acordo com o teu código anterior (não me parece ser a melhor forma de fazer, mas um problema de cada vez), o que deverias ter ai era algo como:

Conexao con = new Conexao(); con.conecta(); final String query = "Select * from acesso where login = "+ jTextField1.getText() + "'"; con.executeSQL(query); ResultSet rs = con.resultset;

no caso se eu fizesse da seguinte forma:

Conexao con = new Conexao();
con.conecta();
final String query = "Select login from acesso where login = "+ jTextField1.getText() + "'";
con.executeSQL(query);        
ResultSet rs = con.resultset;

Como eu faria pra comprar o resultado do rs com o do login que o kra entrou? boto o equals com gettext() mesmo?
H

Testei isso acima e ele deu o seguinte erro:

incompatible types
required: java.sql.ResultSet
found: void

justamente no ResultSet.
Algum de vocês poderia me passar uma classe Connection que eu podesse usar a Statement sem problema?

wagnerfrancisco

henriquez1m:
Testei isso acima e ele deu o seguinte erro:

incompatible types
required: java.sql.ResultSet
found: void

justamente no ResultSet.
Algum de vocês poderia me passar uma classe Connection que eu podesse usar a Statement sem problema?

A classe Connection que você usa faz parte da API padrão do Java, é a mesma que todo mundo usa. O problema está no seu código, a classe Conexao está muito mal elaborada. Na boa - entenda como uma crítica construtiva - você deveria ler um livro de Java e entender melhor os conceitos básicos. Depois vai ser muito mais fácil pra você continuar.

E quanto a lógica para o login, você pode fazer um select que filtra apenas o usuário com determinado login e senha:

select * from acesso where login = ? and senha = ?

Se tiver resultado, é por que o login foi feito com sucesso (existe usuário com a senha informada), caso contrário o login foi mal sucedido e o usuário deve informar os dados novamente. Não precisa comparar mais nada, é só ver se o resultset traz resultado ou não.

Criado 1 de agosto de 2012
Ultima resposta 4 de ago. de 2012
Respostas 20
Participantes 7