Problema para fazer INSERT - HSQLDB

Olá pessoal,

Minha primeira mensagem no guj e já vou logo postando uma bucha aqui! rs!

Estou fazendo uma agenda em java onde tenho 3 tabelas: PESSOA, TELEFONE, EMAIL. Cada pessoa pode ter + de 1 email ou telefone, sendo que o que identifica de quem é o telefone ou email é o ID da pessoa, que está associado. Isso não tem tanta importancia, é só pra ficar mais claro.

vamos ao código:

[code] try {
con = FConexoes.getConexao();
st = FConexoes.getSession();
String nome = tf_nome.getText();
String email1 = tf_email1.getText();
String email2 = tf_email2.getText();
String email3 = tf_email3.getText();
String nascimento = tf_nasc.getText();
String fone1 = tf_fone1.getText();
String fone2 = tf_fone2.getText();
String fone3 = tf_fone3.getText();

        rs = st.executeQuery("select max(id) from pessoa"); //pega o maior numero da coluna ID na tabela pessoa
        if (rs.next()) {
            int cod = rs.getInt(1);
            tf_cod.setText(String.valueOf(cod + 1)); //adiciona +1 no numero obtido para inserir um novo cadastro
        }
       
        int id = Integer.parseInt(tf_cod.getText());

        st.executeUpdate("insert into pessoa (id, nome, nasc) values('" + id + "','" + nome + "','" + nascimento + "')");
        st.executeUpdate("insert into email(id, mail) values('" + id + "'+'" + email1 + "')");
        st.executeUpdate("insert into email(id, mail) values('" + id + "'+'" + email2 + "')");
        st.executeUpdate("insert into email(id, mail) values('" + id + "'+'" + email3 + "')");
        st.executeUpdate("insert into telefone) values('" + id + "'+'" + fone1 + "')");
        st.executeUpdate("insert into telefone) values('" + id + "'+'" + fone2 + "')");
        st.executeUpdate("insert into telefone) values('" + id + "'+'" + fone3 + "')");

        JOptionPane.showMessageDialog(this, "Cadastrado com sucesso!");
        con.close();

        tf_cod.setText("");
        tf_nome.setText("");
        tf_email2.setText("");
        tf_fone1.setText("");
        tf_fone2.setText("");
        tf_fone3.setText("");

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}      [/code]      

Qndo abro a janela para fazer o INSERT no bando de dados (HSQLDB) ele retorna uma mensagem:
“java.sql.SQLException: Wrong data type
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source)”

Talvez eu esteja errando qnto a sintaxe do comando de INSERT no HSQLDB…Vale lembrar que qndo eu uso o comando “rs = st.executeQuery(“select max(id) from pessoa”);” ele retorna corretamente o numero ID maximo da coluna, dessa forma a comunicação com o BD está funcionando.
No entanto os INSERTS não funcionam, alguém pode me ajudar?

Esse erro é defido ao
tipo do seu campo
O campo no banco de dados
é de um tipo e na inserção vc ta mandando
outro tipo

exemplo

seu campo é do tipo string no banco de dados e vc manda uma String
vai da erro mesmo
verifica isso

nunca mexi nesse banco nao, mas olhando seu código vi o seguinte:

 st.executeUpdate("insert into pessoa (id, nome, nasc) values('" + id + "','"

id não é a chave primária da tabela? Pelo que vi pelo seu código ela é um inteiro, certo? Mas vc a está inserindo como string, pois está colocando o id entre aspas simples (’)… olhe bem ali em cima…

 st.executeUpdate("insert into email(id, mail) values('" + id + "'+'" + email1 + "')");  

outra coisa…
vc esqueceu uma vígula aqui e em outras partes da sua query tmb (e colocou as aspas simples de novo…)

 st.executeUpdate("insert into email(id, mail) values('" + id + "', '" + email1 + "')");  

ok?

ok! pessoal! Arrumei tudo que vcs disseram, porém agora estou entrando num maldito erro de violação de pk!

Não sei como isso é possível!

Vou postar o script SQL seguido do código em java!

Script:

[code]
CREATE TABLE PESSOA(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY,NOME VARCHAR(50) NOT NULL,NASC DATE);

CREATE TABLE TELEFONE(ID INTEGER NOT NULL,NUMERO VARCHAR(50) NOT NULL,CONSTRAINT TELEFONE_PK PRIMARY KEY(ID,NUMERO),CONSTRAINT FK_ID1 FOREIGN KEY(ID) REFERENCES PESSOA(ID));

CREATE TABLE EMAIL(ID INTEGER NOT NULL,MAIL VARCHAR(50) NOT NULL,CONSTRAINT EMAIL_PK PRIMARY KEY(ID,MAIL),CONSTRAINT FK_ID2 FOREIGN KEY(ID) REFERENCES PESSOA(ID));

ALTER TABLE PESSOA ALTER COLUMN ID RESTART WITH 11;

INSERT INTO PESSOA VALUES(1,‘Peter Jandl Jr’,NULL)
INSERT INTO PESSOA VALUES(2,‘Renan Reis’,NULL)
INSERT INTO PESSOA VALUES(3,‘Bruno Rico’,NULL)
INSERT INTO PESSOA VALUES(4,‘Antonio Gomes Neto’,NULL)
INSERT INTO PESSOA VALUES(5,‘Gabriel Rovaris’,NULL)
INSERT INTO PESSOA VALUES(6,‘Rubens Aires’,NULL)
INSERT INTO PESSOA VALUES(9,‘Douglas Panegassi’,‘1988-11-14’)
INSERT INTO PESSOA VALUES(10,‘Douglas Panegassi’,‘1988-11-14’)
INSERT INTO TELEFONE VALUES(1,‘19 1234-4567’)
INSERT INTO TELEFONE VALUES(2,‘19 12345678’)
INSERT INTO TELEFONE VALUES(2,‘19 12348765’)
INSERT INTO EMAIL VALUES(1,‘computacao@igh.br’)
INSERT INTO EMAIL VALUES(1,‘jandl@def.br’)
INSERT INTO EMAIL VALUES(1,‘pjandl@abc.br’)[/code]

Java:

try { rs = st.executeQuery("select max(id) from pessoa"); if (rs.next()) { int cod = rs.getInt(1); tf_cod.setText(String.valueOf(cod + 1)); } int id = Integer.parseInt(tf_cod.getText()); System.out.println(id); st.executeUpdate("insert into pessoa (id, nome, nasc) values (" + id + ",'" + nome + "','" + nascimento + "')"); st.executeUpdate("insert into email (id, mail) values (" + id + ",'" + email1 + "')"); st.executeUpdate("insert into email (id, mail) values (" + id + ",'" + email2 + "')"); st.executeUpdate("insert into email (id, mail) values (" + id + ",'" + email3 + "')"); st.executeUpdate("insert into telefone (id, numero) values (" + id + ",'" + fone1 + "')"); st.executeUpdate("insert into telefone (id, numero) values (" + id + ",'" + fone2 + "')"); st.executeUpdate("insert into telefone values (id, numero) (" + id + ",'" + fone3 + "')"); JOptionPane.showMessageDialog(this, "Cadastrado com sucesso!"); } catch (Exception ex) { ex.printStackTrace(); }

Você não está inserindo um ID já existente no banco?? Se não for isso, posta pra gente a mensagem de erro.

Então, acho que não to inserindo a mesma ID não…até porque tem um método alí que pega o último ID (maior) do banco, soma 1 e então usa esse dado para inserir o novo registro!

o erro é o seguinte:

java.sql.SQLException: Unique constraint violation: at org.hsqldb.jdbc.Util.sqlException(Unknown Source) at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source) at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source)

Nesse SGBD, vc nao pode deixá-lo fazer o auto-increment da PK automaticamente?.. o erro que da dando é justamente q vc ta tentando colocar uma PK repetida

até tem auto incremento, mas por 2 motivos eu não uso:

1º - É proposto que a pk seja gerenciada na aplicação (trabalho de faculdade).
2º - Não sei usar…

Mas se alguém souber como faz eu agradeço!

Ve se isso resolve:

try { int id = -1; rs = st.executeQuery("select max(id) from pessoa"); if (rs.next()) { id = rs.getInt("id"); //pega id tf_cod.setText(String.valueOf(cod + 1)); } id ++; //incrementando o id System.out.println(id); st.executeUpdate("insert into pessoa (id, nome, nasc) values (" + id + ",'" + nome + "','" + nascimento + "')"); st.executeUpdate("insert into email (id, mail) values (" + id + ",'" + email1 + "')"); st.executeUpdate("insert into email (id, mail) values (" + id + ",'" + email2 + "')"); st.executeUpdate("insert into email (id, mail) values (" + id + ",'" + email3 + "')"); st.executeUpdate("insert into telefone (id, numero) values (" + id + ",'" + fone1 + "')"); st.executeUpdate("insert into telefone (id, numero) values (" + id + ",'" + fone2 + "')"); st.executeUpdate("insert into telefone values (id, numero) (" + id + ",'" + fone3 + "')"); JOptionPane.showMessageDialog(this, "Cadastrado com sucesso!"); } catch (Exception ex) { ex.printStackTrace(); }

Consegui resolver gente! O problema estava qndo eu mandava o INSERT sendo que alguns campos de telefone ou email estavam em branco…daí ele tentava usar a mesma ID pra inserir. Resolvi dessa forma:

[code] try {
rs = st.executeQuery(“select max(id) from pessoa”);
if (rs.next()) {
int cod = rs.getInt(1);
tf_cod.setText(String.valueOf(cod + 1));
}
int id = Integer.parseInt(tf_cod.getText());

            if (nome.trim().length() != 0) {
                st.executeUpdate("insert into pessoa (id, nome, nasc) values (" + id + ",'" + nome + "','" + nascimento + "')");
            }
            if (email1.trim().length() != 0) {
                st.executeUpdate("insert into email (id, mail) values (" + id + ",'" + email1 + "')");
            }
            if (email2.trim().length() != 0) {
                st.executeUpdate("insert into email (id, mail) values (" + id + ",'" + email2 + "')");
            }
            if (email3.trim().length() != 0) {
                st.executeUpdate("insert into email (id, mail) values (" + id + ",'" + email3 + "')");
            }
            if (fone1.trim().length() != 0) {
                st.executeUpdate("insert into telefone (id, numero) values (" + id + ",'" + fone1 + "')");
            }
            if (fone2.trim().length() != 0) {
                st.executeUpdate("insert into telefone (id, numero) values (" + id + ",'" + fone2 + "')");
            }
            if (fone3.trim().length() != 0) {
                st.executeUpdate("insert into telefone (id, numero) values (" + id + ",'" + fone3 + "')");
            }
            JOptionPane.showMessageDialog(this, "Cadastrado com sucesso!");
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }[/code]

Onde cada IF verifica se há espaços em branco e se o tamanho da string é diferente de zero! Só então ele faz o INSERT!

Obrigado! Havendo mais duvidas eu posto aqui!

Se puder usar em seu projeto o Hibernate tudo ficara mais fácil.

Att, Gaspar Barancelli Junior.

Gente, agora estou com outro problema. Os INSERTs estão funcionando belezinha, mas eu não consigo buscar os dados do banco com SELECT.

tenho 3 tabelas, uma “pessoa”, uma “telefone” e outra “email”. Cada pessoa pode ter até 3 emails e até 3 telefones, sendo que o ID identifica de quem são os telefones armazenados (conforme ja disse alí em cima).

Eu preciso fazer um SELECT que traga TODOS os nomes do banco de dados e seus respectivos emails e telefones das outras tabelas. Já tentei alguns aqui, mas eles trazem todos os valares duplicados e não traz os nomes que não possuem email ou telefone…coisa que era pra ele fazer.

Vejam o meu select:

select p.id, p.nome, p.nasc, t.numero, e.mail from pessoa p, telefone t, email e where p.id = t.id and p.id = e.id

Alguém se habilita?