Erro no Statement.executeQuery() - General Error

11 respostas
Bruno_Ferreira1

Estou fazendo um sistema pra controle de pizzaria, esta quase tudo funcionando, com excessão de uma coisa
quando o usuario clicar no botão Imprimir, seria o mesmo que confirmar compra.
Sendo assim, alem de imprimir a nota, ele guarda algumas informações no banco, em duas tabelas diferentes.
As duas tabelas estão no mesmo banco de dados, uma chamada cliente e uma chamada Vendas.
Na cliente, guarda informações detalhadas da compra, tem 7 campos:nome, pedido, quantidade, preço unitario, valor total, hora e data
Na Vendas, guarda informações mais genéricas sobre a compra, tem 4 campos:nome, valor total, hora e data
O banco se chama Vendas (o mesmo nome da tabela Vendas)

o comando guarda as informações na tabela cliente sem problemas, mas da erro ao tentar gravar dados na tabela Vendas(linha 107)
Estou usando o Access como banco, tirei todas as restrições dos campos, onde os campos nome e valor estão como texto, e os campos
hora e data estão como Hora/Data e mesmo assim continua o erro, que é General Error.
Dei um JOptionPane nas variaveis data e hora e query(ja montada) que serão passadas ao banco, só pra visualizar, e não achei erros

Ja usei um printstacktrace e ele me diz que o problema esta na linha stm.executeQuery(query);
ja tentei usar o breakpoint, não consegui. :shock: Estou o usando o Netbeans 6.9

Segue o codigo:

public class Sistema_Pizzaria extends javax.swing.JFrame{  
   
    private Sistema_Pizzaria() {
        initComponents();
        this.iniciar();        
    }

    public Connection con;    
    public Statement stm;

    public void conectar(){
           try
            {
                /* Tenta se conectar ao Driver */
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            }
            catch (ClassNotFoundException e)
            {
                JOptionPane.showMessageDialog(null, "Impossível carregar o Driver.");
                System.exit(0);
            }
           
            try
            {                
                con = DriverManager.getConnection("jdbc:odbc:Vendas");
                stm = con.createStatement();
             }

            catch (SQLException sqle)
            {
                JOptionPane.showMessageDialog(null, "Problema ao conectar!");
                System.exit(0);
            }
        }

     public void desconectar(){
            try
            {
                con.close();
                stm.close();
            }
            catch (SQLException sqle)
            {
                JOptionPane.showMessageDialog(null, "Problema ao desconectar!");
                System.exit(0);
            }
        }


     public void iniciar(){       
        this.conectar();
        //outros metodos para construir a interface grafica      
        }

    //metodo que guarda os dados, e onde esta o problema
    public void guardarDados(){
            if(txt_nome.getText().equals(""))
                 JOptionPane.showMessageDialog(null,"o campo cliente esta vazio, preencha o campo cliente");

            else{
                //variaveis utilizadas para mandar os valores para o banco
                //variavel nome
                 String nome=txt_nome.getText();
                 //variavel valor total
                 String valor=txt_total.getText();

                 //pegar a data do sistema
                 Date hoje = new Date();
                 SimpleDateFormat df;
                 df = new SimpleDateFormat("dd/MM/yyyy");
                 String data = df.format(hoje);
                 JOptionPane.showMessageDialog(null, data);

                 //pegar a hora do sistema
                 String hora=this.getHora();
                 JOptionPane.showMessageDialog(null, hora);

                 //percorrer a lista pedido para pegar todos elementos da lista
                 int tamanho=modelo_pedido.size();
                 Object pedido[]=new Object[tamanho];
                 Object quant[]=new Object[tamanho];
                 Object val[]=new Object[tamanho];
                 Object unit[]=new Object[tamanho];
                 //gravar dados na tabela cliente dentro do looping
                 for(int i=0;i<tamanho;i++){
                      pedido[i]=modelo_pedido.get(i);
                      quant[i]=modelo_quantidade.get(i);
                      val[i]=modelo_valor.get(i);
                      unit[i]=modelo_unitario.get(i);
                      String querycliente="INSERT INTO Cliente (Nome, Quantidade, Pedido, Unitario, Valor, Hora, Data)"+
"VALUES('"+nome+"',"+quant[i]+",'"+pedido[i]+"','"+unit[i]+"','"+val[i]+"','"+hora+"','"+data+"')";                    
                      try {
                           stm.executeUpdate(querycliente);
                      }
                      catch (SQLException e) {
                           JOptionPane.showMessageDialog(null,"" + e.getMessage(),"Erro",0);
                      }
                 }

                 //comando que sera passado ao banco na tabela Vendas
                 String query="INSERT INTO Vendas (Nome, Valor, Hora, Data) VALUES ('"+nome+"','"+valor+"','"+hora+"','"+data+"')";
                 

               try {
                   JOptionPane.showMessageDialog(null, query);  
                   //o erro esta na linha de baixo                
                   stm.executeUpdate(query);
                    JOptionPane.showMessageDialog(null, "Dados guardados com sucesso");
                }
                catch (SQLException e) {
                    e.printStackTrace();
                    JOptionPane.showMessageDialog(null,"erro na segunda instrução sql");
                    JOptionPane.showMessageDialog(null,"" + e.getMessage(),"Erro",0);
                }
           }
       }

Ja procurei muito e não consegui saber o porque deste erro, se alguem puder me ajudar fico agradecido :wink: >

11 Respostas

kiq095

faça uma coisa … no seu catch

try { JOptionPane.showMessageDialog(null, query); //o erro esta na linha de baixo stm.executeUpdate(query); JOptionPane.showMessageDialog(null, "Dados guardados com sucesso"); } catch (SQLException e) { e.printStackTrace(); JOptionPane.showMessageDialog(null,"erro na segunda instrução sql"); JOptionPane.showMessageDialog(null,"" + e.getMessage(),"Erro",0); } }

colca assim roda denovo e depois coloca o erro ai pra ficar mais facil de achar…

JOptionPane.showMessageDialog(null,"" + e.toString(),"Erro",0);

faz ai e coloca o erro pra ver se posso te ajudar … mais acho que ja tenho uma idea … e no campo data … mais vamos confirmar ne …!!

Bruno_Ferreira1

Deu o seguinte erro:
java.sql.SQLException:General error

kiq095

so aparece isso … mais nada ???

se for isso e por q o mesmo Statement (stm) esta recebendo dois valores …
tenta criar dois Statement (stms) recebendo as mesmas coisas do primeiro mais outra string …

ou entao tente fechar a conexao depois de usar o Statement e depois chamar outra conexao onde ele manda outra string para o Statement…
por q de acordo com o q vc ta falando o primeiro insert esta certo entao da uma olhadinha e me fala… ok

Bruno_Ferreira1

só!
Por isso não consigo achar qual é o problema
Sera que é alguma configuração no Access?
A Data precisaria de alguma formatação antes de ser enviada ao banco?
o engraçado é que na primeira tabela, uso a mesma variavel pra data e hora, ou seja,
a mesma formatação, e na primeira tabela grava sem problemas

a formatação de data que estou usando:“dd/mm/yyyy”
a formatação de hora:“hh:mm:ss”

kiq095

so aparece isso … mais nada ???

se for isso e por q o mesmo Statement (stm) esta recebendo dois valores …
tenta criar dois Statement (stms) recebendo as mesmas coisas do primeiro mais outra string …

ou entao tente fechar a conexao depois de usar o Statement e depois chamar outra conexao onde ele manda outra string para o Statement…
por q de acordo com o q vc ta falando o primeiro insert esta certo entao da uma olhadinha e me fala… ok

foi mal e q eu respondi e depois atualizei …hehehe

Bruno_Ferreira1
Então, tentei fechar o Statement stm.close()

Criei outro Statement stm2.executeQuery(query)

mas continua com o mesmo erro

Ja fechei a conexão e abri antes da segunda instrunção, e o erro persiste
fabim

Dica: troque todos os seus Statemens por PreparedStatement. Tem muito disso aki no guj e no google.

Dessa maneira vc noa precisa se preocupar em ficar formatando SQLs e concatenando coisas.

kiq095

Boa …

Dica: troque todos os seus Statemens por PreparedStatement. Tem muito disso aki no guj e no google.

mais ao ivez de fechar tente somente criar outro Statemens…resembendo a mesma conexao que o primeiro …

vc comentou de formato de data e hora se fosse isso quando vc adicionasse o e.toString() no JopitionPane aparecia o erro e o nome do campo que esta errado …

mais da uma olhadinha … e fala se deu certo ou nao …!

Bruno_Ferreira1

Usei o PreparedStatement e deu um erro dizendo que o Driver não suporta esta função

String query="INSERT INTO Vendas (Nome, Valor, Hora, Data) VALUES (?,?,?,?)";

               try {                              
                   PreparedStatement pstm=con.prepareStatement(query);
                   
                   //ja tentei utilizar com aspas e sem aspas
                   pstm.setString(1,"'"+nome+"'");
                   pstm.setString(2,"'"+valor+"'");
                   pstm.setString(3,"'"+hora+"'");
                   pstm.setString(4,"'"+data+"'");

                   pstm.executeUpdate(query);
                   JOptionPane.showMessageDialog(null, "Dados guardados com sucesso");
                   
                }
                catch (SQLException e) {
                    e.printStackTrace();
                    JOptionPane.showMessageDialog(null,"erro na segunda instrução sql");
                    JOptionPane.showMessageDialog(null,"" + e.getMessage(),"Erro",0);
                    JOptionPane.showMessageDialog(null,"" + e.toString(),"Erro",0);
                }
           }
Bruno_Ferreira1

kiq095:
Boa …
Dica: troque todos os seus Statemens por PreparedStatement. Tem muito disso aki no guj e no google.

mais ao ivez de fechar tente somente criar outro Statemens…resembendo a mesma conexao que o primeiro …

vc comentou de formato de data e hora se fosse isso quando vc adicionasse o e.toString() no JopitionPane aparecia o erro e o nome do campo que esta errado …

mais da uma olhadinha … e fala se deu certo ou nao …!

Ja fiz isso, mas da o mesmo erro
Ja criei outro Statement usando a mesma conexão, e o erro persiste

Bruno_Ferreira1

Então reformulando a pergunta, como criar um breakpoint, para poder debugar e ver onde esta o erro?
ja tentei mas não consegui
Estou usando o NetBeans 6.9

Criado 29 de março de 2011
Ultima resposta 30 de mar. de 2011
Respostas 11
Participantes 3