Insert com erro[RESOLVIDO]

não consigo inserir os dados no bd
achei que era problema no meu bd mas criei uma tabela de campo unico para teste e inseriu
logo acho que o problema é no meu codigo sql ou tipos da tabela e o sexo eu não sei pegar do jRadioButton

[code] String nome = P_nome.getText();
String telefone = “(”+jTextField2.getText()+")"+jTextField3.getText();
String celular = “(”+jTextField5.getText()+")"+jTextField4.getText();
String cidade = jTextField11.getText();
int ra = Integer.parseInt(jTextField12.getText());
Date data_nasc= jDateChooser1.getDate();

     private void BtnConfirmarActionPerformed(java.awt.event.ActionEvent evt) {                                             
 
    String nome = P_nome.getText();
    String telefone = "("+jTextField2.getText()+")"+jTextField3.getText();
    String celular = "("+jTextField5.getText()+")"+jTextField4.getText();   
    String cidade = jTextField11.getText();
    int ra = Integer.parseInt(jTextField12.getText());
    Date data_nasc= jDateChooser1.getDate();
       
     try {    
    Class.forName("com.mysql.jdbc.Driver");    
       Connection conn = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/bdprojeto", "root","admin");    
        Statement stm= conn.createStatement();
                 
       stm.executeUpdate("INSERT INTO pessoa VALUES('"+nome+"','"+telefone+"','"+celular+"','"+cidade+"','"+ra+"','"+data_nasc+"+'m' )");
   } catch (ClassNotFoundException ex) {    
       Logger.getLogger(ProjetoView.class.getName()).log(Level.SEVERE, null, ex);    
   } catch (SQLException ex) {    
       Logger.getLogger(ProjetoView.class.getName()).log(Level.SEVERE, null, ex);
   }

[/code]essa é minha tabela

Tabela pessoa

codPessoa int(11) <auto_increment>
nome Varchar(45)
telefone char(12)
celular char(12)
cidade varchar(30)
data_nasc date
sexo char(1)

agradeço desde já

stm.executeUpdate("INSERT INTO pessoa VALUES('"+nome+"','"+telefone+"','"+celular+"','"+cidade+"','"+ra+"','"+data_nasc+"+'m' )");  

Aposto que o erro está no +‘m’.
Ao invés do +, coloque uma vírgula.

Dá alguma mensagem de erro?
se sim posta ai, que vai ajudar nos te ajudarmos

Posta a mensagem de erro que aparce pra vc!!!
Assim fica mais facil de solucionar o problema!!! :slight_smile:

stm.executeUpdate("INSERT INTO pessoa VALUES('"+nome+"','"+telefone+"','"+celular+"','"+cidade+"','"+ra+"','"+data_nasc+"','M' )");//consertei aqui mas ainda não vai

erro:

[color=red]23/05/2011 12:26:48 projeto.cadNutricionista BtnConfirmarActionPerformed
GRAVE: null
java.sql.SQLException: Incorrect integer value: ‘alisson’ for column ‘codPessoa’ at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3597)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1698)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1617)
at projeto.cadNutricionista.BtnConfirmarActionPerformed(cadNutricionista.java:313)
at projeto.cadNutricionista.access$000(cadNutricionista.java:31)
at projeto.cadNutricionista$1.actionPerformed(cadNutricionista.java:115)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6288)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6053)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
[/color]

Tá tentando inserir um varchar em uma coluna do tipo int.

pensei que por ser auto increment iria pular o campo
ja esta concertado
mas agora esta dando problema com o campo data_nasc

[color=red]23/05/2011 13:00:23 projeto.cadNutricionista BtnConfirmarActionPerformed
GRAVE: null
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: ‘Sat May 07 13:00:16 BRT 2011’ for column ‘data_nasc’ at row 1
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3595)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3529)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1698) …

[/color]

Use preparedStatement ou converta a data para o formato “yyyy-MM-dd”.

vai uma boa dica ai…
quando vc for criar queris de insert coloque os campos q vc vai inserir na sequencia q vc sabe, pois quando vc não coloca a ordem o banco faz a ordem que ele acha que é, ai depois vc cria uma nova coluna e o banco altera a ordem ai seu codigo para de funfar…

Exemplo:

INSERT INTO pessoa(nm_nome,nr_telefone,nr_celular,nm_cidade,cd_ra,dt_nasc) VALUES('"+nome+"','"+telefone+"','"+celular+"','"+cidade+"','"+ra+"','"+data_nasc+"+'m' 

e tb utilize o preparedStatement é muito mais seguro, já ouviu falar de sql injection ?.. é possivel deletar sua tabela do jeito q esta o seu codigo, c o usuario manjar de sql e quizer zuar sua app…

[quote=Priuli]vai uma boa dica ai…
quando vc for criar queris de insert coloque os campos q vc vai inserir na sequencia q vc sabe, pois quando vc não coloca a ordem o banco faz a ordem que ele acha que é, ai depois vc cria uma nova coluna e o banco altera a ordem ai seu codigo para de funfar…

Exemplo:

INSERT INTO pessoa(nm_nome,nr_telefone,nr_celular,nm_cidade,cd_ra,dt_nasc) VALUES('"+nome+"','"+telefone+"','"+celular+"','"+cidade+"','"+ra+"','"+data_nasc+"+'m' 

e tb utilize o preparedStatement é muito mais seguro, já ouviu falar de sql injection ?.. é possivel deletar sua tabela do jeito q esta o seu codigo, c o usuario manjar de sql e quizer zuar sua app…[/quote]

Nenhum SGBD coloca na “ordem que ele acha que é”, ele segue a sequencia na qual a tabela foi criada.
Corrigindo tua dica, sempre defina quais colunas e quais valores serão passados, evitando, assim, que um campo receba o valor de outro

"INSERT INTO table1 (col1, col2, col3, col5, col4)//propositadamente invertidas as colunas 5 e 4 
  VALUES
  ('valCol1', 'valCol2','valCol3','valCol5','valCol4')"

Masssssssssssssssssssssssssss, ainda assim, você só pode omitir campos que aceitem valores null.

E, por favor, aprenda a utilizar PreparedStatement

Basta vc criar a estrutura de um jeito na base de homologação e criar diferente na base de produção para acabar com o teu insert.
*Eu não conheço todos os SGBD, e não fico a merçe das implementações de cada um!

Eu já tive problemas com uma base oracle que alguem mudou a estrutura da ordem das colunas e precisei refazer todo o codigo de uma aplicação proprietaria, dica minha é fazer uma fez certo para não voltar atraz para corrigir problemas bobos.

[quote=Priuli][quote=drsmachado]
Nenhum SGBD coloca na “ordem que ele acha que é”, ele segue a sequencia na qual a tabela foi criada.
Corrigindo tua dica, sempre defina quais colunas e quais valores serão passados, evitando, assim, que um campo receba o valor de outro
[/quote]

Basta vc criar a estrutura de um jeito na base de homologação e criar diferente na base de produção para acabar com o teu insert.
*Eu não conheço todos os SGBD, e não fico a merçe das implementações de cada um!

Eu já tive problemas com uma base oracle que alguem mudou a estrutura da ordem das colunas e precisei refazer todo o codigo de uma aplicação proprietaria, dica minha é fazer uma fez certo para não voltar atraz para corrigir problemas bobos.[/quote]
Meu camarada, não entendi sua “crítica”…
Afinal

INSERT INTO table1 (col1, col4, col16, col10) VALUES ('valCol1','valCol4','valCol16','valCol10')

Irá inserir estes dados na tabela, independente da ordem das colunas, em qualquer banco de dados.

Como existem projetos em que o DBA é um e os desenvolvedores, outros, sempre é possível que haja alterações que nem sempre serão avisadas.

Não é critica! é o meu ponto de vista.
acho q tomei muito café num tinha visto a sua linha: “Corrigindo tua dica, sempre defina quais colunas e quais valores serão passados, evitando, assim, que um campo receba o valor de outro”

Sim, por isso defina a ordem dos campos no insert!!

:wink:

Cara nunca gostei dessa forma que fazem por aii, achu muita bagunça…

muda a forma de fazer,

ex:

[code] con = DAOConexao.getConn();
String sql = “INSERT into tb_Clientes (CodigoImprCliente ,NomeCLi ,EnderecoCli ,TelefoneCli)” + " VALUES (? ,?, ?, ?)";

        pstm = con.prepareStatement(sql);  
        
                                            pstm.setString(1,cad.getCodigoImprCliente());
		pstm.setString(2,cad.getNome());							
		pstm.setString(3,cad.getEndereco());			
		pstm.setString(4,cad.getTel());
		
		pstm.executeUpdate(); 
		con.commit();[/code]

[quote=lokit"s]Cara nunca gostei dessa foram que fazem por aii, achu muita bagunça…

muda a forma de fazer,

ex:

[code] con = DAOConexao.getConn();
String sql = “INSERT into tb_Clientes (CodigoImprCliente ,NomeCLi ,EnderecoCli ,TelefoneCli)” + " VALUES (? ,?, ?, ?)";

        pstm = con.prepareStatement(sql);  
        
                                            pstm.setString(1,cad.getCodigoImprCliente());
		pstm.setString(2,cad.getNome());							
		pstm.setString(3,cad.getEndereco());			
		pstm.setString(4,cad.getTel());
		
		pstm.executeUpdate(); 
		con.commit();[/code][/quote]

Issu use, o con.prepareStatement(sql).

consegui
e agora estou usando
con.prepareStatement(sql);

// corrijam se estiver errado
pelo que entendi quando uso Statement o usuario pode fazer o que quiser com meu BD atraves do jTextField até mesmo um “drop table”, ja com prepareStatement isso não acontece

agora fica a duvida em que ocasião o statement deve ser utilizado?

de um pequena lida nesse tópico

http://www.guj.com.br/articles/7

abrxx

Sempre que o valor dos campos vier de um formulario aberto, onde o usuario pode digitar qualquer coisa.
Mas independente o que o usuário possa fazer com a sua query o statement permite que sua aplicação não dependa de comando específicos do driver do bancodedados, como por exemplo os campos date que no oracle vc teria que usar TO_DATE(‘25/05/2011’,‘DD/MM/YYYY’) vc poderia usar o stm.setDate() e ficaria livre das diferentes formas que cada bando de dados tem, podendo trocar o driver do banco sem ter q se preocupar tanto com os comandos específicos nas suas queries

entendido
muito obrigado a tds que ajudaram teh+