Banco de Dados

5 respostas
P
Pessoal é o seguinte: eu estou fazendo um sistema em que tem um cadastro de materiais.... eu fiz uma classe para gravar, alterar etc.. do banco de dados... eu faço o botão, parece que dá tudo certo, mas não grava... Aqui está a linha da classe chamada sqlMateriais:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
/*
 * sqlMateriais.java
 *
 * Created on 27 de Julho de 2006, 09:43
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/**
 *
 * @author maq14
 */
public class sqlMateriais {
    
    /** Creates a new instance of sqlMateriais */
    public sqlMateriais() {
    }
    
    public static PreparedStatement stmt;
    public static Statement stm;
    public static Connection con;
    public static ResultSet rs;
    public static int codigo;
    public static String descricao;
    public static String quantidade;
    public static String valor;
    
    public static void setCodigo(int aCodigo){
        codigo = aCodigo;
    }
    
    public static int getCodigo(){
        return codigo;
    }
    
    public static void setDescricao(String aDescricao){
        descricao = aDescricao;
    }
    
    public static String getDescricao(){
        return descricao;
    }
    
    public static void setQuantidade(String aQuantidade){
        quantidade = aQuantidade;
    }
    
    public static String getQuantidade(){
        return quantidade;
    }
    
    public static void setValor(String aValor){
        valor = aValor;
    }
    
    public static String getValor(){
        return valor;
    }
    
    public static String conecta(){
        try{
            Class.forName("org.gjt.mm.mysql.Driver");
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/provapaulo", "alunos", "alunos");
        } catch (Exception e){
            System.out.println(e);
        }
        return null;
    }
    
    public static String desconecta(){
        try{
            con.close();
            stmt.close();
        } catch (Exception e){
            System.out.println(e);
        }
        return null;
    }
    
    public static String gravarMateriais(String gdescricao, String gquantidade, String gvalor){
        conecta();
        try{
            stmt = con.prepareStatement("INSERT INTO Materiais (Descricao, Quantidade, Valor) VALUES (0,?,?,?)");
            stmt.setString(1, gdescricao);
            stmt.setString(2, gquantidade);
            stmt.setString(3, gvalor);
            stmt.executeUpdate();
            stmt.execute("COMMIT");
        } catch(Exception e){
            System.out.println(e);
        }
        desconecta();
        return null;
    }
    
    public static String consultarMateriais(int codigo){
        conecta();
        try{
            stm = con.createStatement();
            String SQL = "SELECT * FROM Materiais WHERE Codigo="+codigo;
            rs = stm.executeQuery(SQL);
            if(rs.next()){
                setDescricao(String.valueOf(rs.getObject("Descricao")));
                setQuantidade(String.valueOf(rs.getObject("Quantidade")));
                setValor(String.valueOf(rs.getObject("Valor")));
            }
        } catch (Exception e){
            System.out.println(e);
        }
        desconecta();
        return null;
    }
    
    public static String alterarMateriais(int codigo, String descricao, String quantidade, String valor){
        conecta();
        try{
            stm = con.createStatement();
            String SQL= "UPDATE Materiais SET Descricao='"+descricao+"', Quantidade='"+quantidade+"', Valor='"+valor+"'WHERE Codigo="+codigo;
            stm.executeUpdate(SQL);
            stmt.execute("COMMIT");
        } catch (Exception e){
            System.out.println(e);
        }
        desconecta();
        return null;
    }
    
}

Aparentemente está tudo certo: Nome do banco, senha.. tudo...
Agora vai a linha de comando que faz gravar as informações no banco de dados:

private void bGravarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
        materiais.gravarMateriais(tfDescricao.getText(), tfQtd.getText(), tfValor.getText());
    }
Eu instanciei o objeto assim:
sqlMateriais materiais = new sqlMateriais();

Quando eu execute ele dá a seguinte mensagem:

java.sql.SQLException: Column count doesn't match value count at row 1

O que será que eu estou fazendo de errado???

Obrigado[/code]

5 Respostas

G

Cara,
não sei se vai mudar muita coisa, mas eu tentaria fazer o seguinte:

troca este código:

stmt = con.prepareStatement(INSERT INTO Materiais (Descricao, Quantidade, Valor) VALUES (0,?,?,?));

stmt.setString(1, gdescricao);

stmt.setString(2, gquantidade);

stmt.setString(3, gvalor);

stmt.executeUpdate();

stmt.execute(COMMIT);

por este:

stmt = con.prepareStatement("INSERT INTO Materiais (Descricao, Quantidade, Valor) VALUES (’ “+ gdescricao +” ', " + gquantidade + , + gvalor + ));

stmt.executeUpdate();

stmt.execute(commit);

Pode ser que não mude nada, mas eu tentaria fazer isso.
Falow…

P

Cara!!! Funcionou!!! Obrigado parceiro!!!
mas agora eu tenho uma dúvida:
Quando eu for fazer um cadastro de clientes eu faço assim também?
Eu só fico perdido nas aspas…
Tem como vc me mandar um exemplo que contenha os campos:
Codigo, Nome, Sexo, DataNasc, EstadoCivil, RG, CPF, Endereco, Bairro, Cidade, CEP, Telefone, Ramal, Celular, Observacoes
É claro se não for pedir muito hehehe.
É porque eu não entendi a lógica das Aspas…
Obs: Todos os campos exceto o Codigo são do tipo String.
Obs2: O Codigo não vai precisar gravar pois é Auto_Increment.
Obrigado

A

colegas, embora o problema tenha sido resolvido, tenho a comentar que o erro estava aqui:

stmt = con.prepareStatement("INSERT INTO Materiais (Descricao, Quantidade, Valor) VALUES (0,?,?,?)");

Esta linha ficaria correta se escrita assim:

stmt = con.prepareStatement("INSERT INTO Materiais (Descricao, Quantidade, Valor) VALUES (?,?,?)");

A explicação: você estava tentanto inserir um registro numa tabela com três campos. Os “?” representam os parâmetros. Então a instrução SQL, em sua parte variável, tinha que conter três “?” e mais nada. O que te atrapalhava era aquele “0”.

Outra dica: o jeito correto de usar PreparedStatement é colocar o “?” na parte variável da instrução SQL ao invés de concatenar pedaços de Strings. Porque: você envia o comando uma única vez ao banco, e depois vai só trocando o valor de parâmetros. Além do que, o código fica mais fácil de manter. Fora que você ia ter que ralar mais um bocadinho se tivesse que inserir um material com o nome “óleo Joana D’arc” por exemplo.

Sucesso aí pra todos!!

P

é que na verdade eu aprendi assim:
o 0 quer dizer do campo código e os ? querem dizer dos outros campos…
Então quer dizer que se eu não colocar o zero, vai funcionar?
pois eu fiz o meu banco de dados com auto_increment o código, ou seja, ele coloca o código automaticamente…
se é assim…
muito obrigado a todos que postarem as suas respostas…
muito agradecido.
T+

A

Se seu campo é autoincremento, ele não precisa entrar na instrução insert. Um insert só precisa conter os nomes de campos que são obrigatórios (not null) na tabela. Veja, por exemplo uma tabela assim:

campo1 - autoincremento
campo2 - texto
campo3 - numérico not null

este insert funcionaria:

insert into tabela(campo3) values(50)

Porque: você está dizendo explicitamente que o valor 50 tem que entrar no campo3. Se o campo2 não tem restrição (pode ficar vazio na tabela), você só inclui ele no insert se tiver um valor pra passar pra ele. O campo1, como é autoincremento, fica por conta do banco gerar automaticamente o valor para ele.

Criado 20 de novembro de 2006
Ultima resposta 21 de nov. de 2006
Respostas 5
Participantes 3