Conexão com o Banco [Não resolvido]

5 respostas
gp7junior

Ao tentar inserir dados no banco de dados, é lançada a seguinte excessão:

java.sql.SQLException: [Microsoft][Driver ODBC para Microsoft Access] Parâmetros insuficientes. Eram esperados 1. at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957) at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114) at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3110) at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338) at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:253) at sistemadohotel.Banco.consulta(Banco.java:59) at sistemadohotel.GerenciadorDeQuartos.cadastraQuartos(GerenciadorDeQuartos.java:27) at sistemadohotel.Main.main(Main.java:51)

O meu banco tem 3 tabelas:

Quarto(NumeroDoQuarto:Texto,QuantidadeDeCamas:inteiro,Capacidade:Numero,Status:boolean)
Hospede(idHospede:Texto,NomeDoHospede:Texto);
Hospedagem(idCadastro:Texto,NumeroDoQuarto:Texto,idHospede:Texto,dataDeEntrada:Data,DataDeSaida:Data)

Minha intrução de Inserção:

INSERT INTO QUARTO VALUES("+quarto.getNumeroDoQuarto()+","+quarto.getQuantidadeDeCamas()+","+quarto.getCapacidade()+","+quarto.isStatus()+");"

Minha classe quarto:

public class Quarto {
    
    private String numeroDoQuarto;
    private int quantidadeDeCamas;
    private int capacidade;
    private boolean status;
    
    /** Creates a new instance of Quarto */
    public Quarto(String numeroDoQuarto, int quantidadeDeCamas,int capacidade) {
        this.setNumeroDoQuarto(numeroDoQuarto);
        this.setQuantidadeDeCamas(quantidadeDeCamas);
        this.setCapacidade(capacidade);
        this.setStatus(true);
    }
    
    public void alteraDadosDoQuarto(Quarto quarto){
        this.setNumeroDoQuarto(quarto.getNumeroDoQuarto());
        this.setQuantidadeDeCamas(quarto.getQuantidadeDeCamas());
        this.setCapacidade(quarto.getCapacidade());
    }
    
    public boolean possuiVaga(){
        return (this.getCapacidade() &gt 0)?true:false;
    }
    
    public void adicionaHospede(Hospede hospede){
        
        setCapacidade(getCapacidade()-1);
    }
    
    public void removeHospede(Hospede hospede){
        
        setCapacidade(getCapacidade()+1);
    }

    public String getNumeroDoQuarto() {
        return numeroDoQuarto;
    }

    public void setNumeroDoQuarto(String numeroDoQuarto) {
        this.numeroDoQuarto = numeroDoQuarto;
    }

    public int getQuantidadeDeCamas() {
        return quantidadeDeCamas;
    }

    public void setQuantidadeDeCamas(int quantidadeDeCamas) {
        this.quantidadeDeCamas = quantidadeDeCamas;
    }

    public int getCapacidade() {
        return capacidade;
    }

    public void setCapacidade(int vagas) {
        this.capacidade = vagas;
    }   

    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }
    
}

OBS: Os dados não são inseridos no banco.

5 Respostas

ramilani12
INSERT INTO QUARTO VALUES("+quarto.getNumeroDoQuarto()+","+quarto.getQuantidadeDeCamas()+","+quarto.getCapacidade()+","+quarto.isStatus()+");"

Jogue fora isso e utilize PreparedStatement:
Sobre PreparedStatement

pstmt = Connection.prepareStatement("INSERT INTO QUARTO VALUES(?,?,?)");
pstmt.clearParameters();
pstmt.setString(1, objeto1);
pstmt.setLong(2, objeto2);
pstmt.executeUpdate();

Qnto erro verifique se vc passou a qtde parametros corretos

_Renatu

Tem algum erro nos parâmetros…

Pode ser a falta de aspas ou algo assim…

Geralmente a gente resolve este problema com PreparedStatements…

dá uma pesquisada sobre eles, deixam o código bem mais limpo também…

otaviofcs
  1. não me lembro do Access aceitar o formato de sql
insert into tabela values (valor1, valor2)

que eu me lembre tem que ser:

insert into tabela (campo1, campo2) values (valor1, valor2)
  1. verifique, se o access aceitar a forma de sql que você descreveu, se os campos estão na ordem correta que aparecem na tabela;
  2. Porque raios usar o Access??? Pior impossível para mandar para clientes, para performance,… Tanto banco bom de graça (MySQL para servidor, HSQLDB para embarcado,…)

abraços,

otávio

PS: reitero o que disseram acima, use o PreparedStatement

gp7junior

otaviofcs:
1) não me lembro do Access aceitar o formato de sql

  1. Porque raios usar o Access??? Pior impossível para mandar para clientes, para performance,… Tanto banco bom de graça (MySQL para servidor, HSQLDB para embarcado,…)

Voce teria uma melhor solução para que eu substitua o Acces?
se sim, qual banco utilizar?

otaviofcs

Voce teria uma melhor solução para que eu substitua o Acces?
se sim, qual banco utilizar?

Veja bem, access não é um banco de todo ruim. Ele tem os wizards para construir consultas e mascara algumas coisas para você para tornar sua vida mais fácil. Por outro lado ele:

  1. tem uma performance patética;
  2. na rede nem se fala;
  3. access com java ainda tem que usar mais uma camada que é o odbc.

Veja o que eu disse no item 3:

Agora, depende da sua necessidade, do seu produto…

abraços,

Otávio

Criado 6 de junho de 2007
Ultima resposta 8 de jun. de 2007
Respostas 5
Participantes 4