Banco de Dados

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:

[code]
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;
    }

}[/code]

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]

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…

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

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!!

é 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+

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.