Inserir registo no mySQL

7 respostas
L

Boas pessoal,

Estou a tentar inserir um registo na base de dados ( MySql ) e estou recebendo dois tipos de erro :

O  é :

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column 'Acordado' in 'field list'
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3118)
        at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1313)
        at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1232)




O  é ( Acontece quando eu selecciono determinado valor numa comboBox

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TV)' at line 1
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2870)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1573)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3118)
        at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1313)
        at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1232)

Eis o codigo :

String tt= ititulo.getText();
        String form= (String)iformato.getSelectedItem();
        String img = iimagem.getText();
        String gen = (String)igenero.getSelectedItem();


String qq = "insert into dvd(titulo, formato, imagem, genero) values("+tt+","+form+","+img+","+gen+")";
       insereDados id = new insereDados(qq);

A base de dados esta assim :

Database name : livraria
        -> Tabela Name : dvd 
                      -> Campo DVDREF ( Campo que se auto incrementa, é KEY )
                      -> Campo TITULO ( String 50 caracteres )
                      -> Campo FORMATO ( String 30 caracteres )
                      -> Campo IMAGEM ( String 30 caracteres )
                      -> Campo GENERO ( String 30 caracteres )

O que estará mal no meu codigo ?

7 Respostas

fiaux

Provavelmente faltou aspas em algum lugar e o SQL ficou mal formado no final. Use prepared statement para resolver isso.

L

Estou a usar assim :

Classe isereDados{

public insereDados(String query){

....



 Connection connection = null;
    
    try {
        // Load the JDBC driver
        String driverName = "org.gjt.mm.mysql.Driver"; // MySQL MM JDBC driver
        Class.forName(driverName);
    
        // Create a connection to the database
        String serverName = "localhost";
        String mydatabase = "livraria";
        String url = "jdbc:mysql://" + serverName +  "/" + mydatabase; // a JDBC url
        String username = "userid";
        String password = "pass";
        connection = DriverManager.getConnection(url, username, password);
Statement stmt = connection.createStatement();    
stmt.executeUpdate(query);


....
}
}

tem alguma coisa de errado ai ?

GabrielCorpse

Caro Luis Claudio, o primeiro erro informa que o teu comando tenta utilizar a coluna “Acordado”, sendo que ela não existe.
Já o segundo é referente a sintaxe, provavelmente erro devido as aspas.
Assim, como nosso camarada Flaux disse, utilize prepareStatement, recomendo também printar a query e testá-la no console do próprio mysql, aí tu verás o erro claramente.
Espero ter ajudado, abraço.

L

Bom corri a consola do Mysql e inserir a seguinte instrução :

Enter password: *****
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 29 to server version: 5.0.27-community-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use livraria
Database changed
mysql> insert into dvd (titulo, formato, imagem, genero) values("PB", "DVD", "PB
.jpg", "Serie");
Query OK, 1 row affected (0.09 sec)

mysql>

Portanto nao sei o que pdoerá estar mal…

Quanto ao prepareStatement… quanto tento alterar de Statement para prepareStatement da um erro de sintaxe dizendo que :
Incompatible Types :

Voce pode me ajudar em como usar o prepareStatement em vez o Statement
E ja agora qual a diferença entre eles ?

Obrigado

GabrielCorpse

Caro LuisClaudio, utilize aspas simples no mysql, é o padrão.
O prepareStatement permite a execução de consultas parametrizadas, além de aumentar o desempenho.
Dê uma olhada neste tutorial da sun, ele te mostrará como usar o prepareStatement: http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html
Qualquer dúvida estamos aí.
Abraço.

fiaux

Sobre prepared statement: Olhe o tutorial do GUJ.

Essa linha/;

String qq = "insert into dvd(titulo, formato, imagem, genero) values("+tt+","+form+","+img+","+gen+")";

Você deve printar esse sql formado. Provavelmente ele está sendo gerado sem as aspas que o MySQL precisa para identificar que é uma string o valor que você quer inserir.

O certo seria algo assim, caso todos os campos sejam string:

String qq = "insert into dvd(titulo, formato, imagem, genero) values('"+tt+"','"+form+"','"+img+"','"+gen+"')";
F

Olá Luis,

Conforme o Gabriel disse, no seu BD não existe a coluna “acordado”, verifique novamente seu código, vc deve ter invertido alguma coisa, como exemplo ter colocado o valor da variavel, e não o nome da coluna certa do banco de dados, e como o fiaux disse, siga o padrão que ele colocou para ser usado na inserção no mysql, os detalhes das aspas, enfim, deve ser coisa besta, da uma consultada que vc achará aonda estão os erros …

Generosamente,

Frid

Criado 7 de setembro de 2008
Ultima resposta 9 de set. de 2008
Respostas 7
Participantes 4