Dúvida com tratamento de String - RESOLVIDO

Bom dia, estou inicializando meus estudos em JAVA e ainda tenha dúvidas básicas, estou montando um projeto de teste para salvar dois valores no banco hsqldb, estes dois valores são do tipo String, mas aprsenta erro, conforme abaixo:

  1. Cadastrar Carro e Kilometragem:
  2. Listar os carros cadastrados:
  3. Sair

Escolha a opçao desejada:
1
Qual o nome do carro?
sandro
Qual o Quilometragem do carro?
51

java.sql.SQLException: Unexpected token 6, requires ( in statement [INSERT INTO sample_table(str_col,num_col) VALUES 6]
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source)
at project.MainProject.update(MainProject.java:87)
at project.MainProject.main(MainProject.java:174)

Segue abaixo o Código:

package project;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/**
 * Title:        Testdb
 * Description:  simple hello world db example of a
 *               standalone persistent db application
 *
 *               every time it runs it adds four more rows to sample_table
 *               it does a query and prints the results to standard out
 *
 * Author: Karl Meissner karl@meissnersd.com
 */
public class MainProject {
	private static Scanner leitor = new Scanner(System.in);
	
    Connection conn;  //our connnection to the db - presist for life of program
	private String opcao;

    // we dont want this garbage collected until we are done
    public MainProject(String db_file_name_prefix) throws Exception {    // note more general exception

        // Load the HSQL Database Engine JDBC driver
        // hsqldb.jar should be in the class path or made part of the current jar
        Class.forName("org.hsqldb.jdbcDriver");

        // connect to the database.   This will load the db files and start the
        // database if it is not alread running.
        // db_file_name_prefix is used to open or create files that hold the state
        // of the db.
        // It can contain directory names relative to the
        // current working directory
        conn = DriverManager.getConnection("jdbc:hsqldb:"
                                           + db_file_name_prefix,    // filenames
                                           "sa",                     // username
                                           "");                      // password
    }

    public void shutdown() throws SQLException {

        Statement st = conn.createStatement();

        // db writes out to files and performs clean shuts down
        // otherwise there will be an unclean shutdown
        // when program ends
        st.execute("SHUTDOWN");
        conn.close();    // if there are no other open connection
    }

//use for SQL command SELECT
    public synchronized void query(String expression) throws SQLException {

        Statement st = null;
        ResultSet rs = null;

        st = conn.createStatement();         // statement objects can be reused with

        // repeated calls to execute but we
        // choose to make a new one each time
        rs = st.executeQuery(expression);    // run the query

        // do something with the result set.
        dump(rs);
        st.close();    // NOTE!! if you close a statement the associated ResultSet is

        // closed too
        // so you should copy the contents to some other object.
        // the result set is invalidated also  if you recycle an Statement
        // and try to execute some other query before the result set has been
        // completely examined.
    }

//use for SQL commands CREATE, DROP, INSERT and UPDATE
    public synchronized void update(String expression) throws SQLException {

        Statement st = null;

        st = conn.createStatement();    // statements

        int i = st.executeUpdate(expression);    // run the query

        if (i == -1) {
            System.out.println("db error : " + expression);
        }

        st.close();
    }    // void update()

    public static void dump(ResultSet rs) throws SQLException {

        // the order of the rows in a cursor
        // are implementation dependent unless you use the SQL ORDER statement
        ResultSetMetaData meta   = rs.getMetaData();
        int               colmax = meta.getColumnCount();
        int               i;
        Object            o = null;

        // the result set is a cursor into the data.  You can only
        // point to one row at a time
        // assume we are pointing to BEFORE the first row
        // rs.next() points to next row and returns true
        // or false if there is no next row, which breaks the loop
        for (; rs.next(); ) {
            for (i = 0; i < colmax; ++i) {
                o = rs.getObject(i + 1);    // Is SQL the first column is indexed

                // with 1 not 0
                System.out.print(o.toString() + " ");
            }

            System.out.println(" ");
        }
    }                                       // void dump( ResultSet rs )

    public static void main(String[] args) {
    	String opcao;
        MainProject db = null;

        try {
            db = new MainProject("db_file.db");
        } catch (Exception ex1) {
            ex1.printStackTrace();    // could not start db
            return;                   // bye bye
        }

        try {

            //make an empty table
            //
            // by declaring the id column IDENTITY, the db will automatically
            // generate unique values for new rows- useful for row keys
            db.update(
                "CREATE TABLE sample_table ( id INTEGER IDENTITY, str_col VARCHAR(256), num_col INTEGER)");
        } catch (SQLException ex2) {

            //ignore
            //ex2.printStackTrace();  // second time we run program
            //  should throw execption since table
            // already there
            //
            // this will have no effect on the db
        }
        try {           	
        	
    		do{
    			System.out.println("\n1. Cadastrar Carro e Quilometragem:");
    			System.out.println("2. Listar os carros cadastrados:");
    			System.out.println("3. Sair");
    			System.out.println("\nEscolha a opçao desejada:");
    			opcao = leitor.nextLine();
    			
    			if(opcao.equals("1")){
    				//cadastrar um carro e a quilometragem total do carro
            		String nome;
            		String quilometragem;
            		String stu;
            		
        			System.out.println("Qual o nome do carro?");
        			nome = leitor.nextLine();            		
            		
        			System.out.println("Qual o Quilometragem do carro?");
        			quilometragem = leitor.nextLine();
        			
            		//*********** DUVIDA NO INSERT *******************
        			// Quero salvar no banco o conteúdo das variáveis
        			stu = "INSERT INTO sample_table(str_col,num_col) VALUES (" + nome + "," + quilometragem + ")";
                    db.update(stu);
                                                                    // nome, quilometragem
                    //************************************************
                    
                    
    			}else if(opcao.equals("2")){   				
                	// listar o conteúdo da tabela
                    System.out.println("Dados inseridos com sucesso!\n\n");      
                    // do a query
                    System.out.println("DADOS CONTIDOS NA TABELA:\n");
                    db.query("SELECT * FROM sample_table");
                    
                    
    			}else if(opcao.equals("3")){ 				
                    // SAIR DO PROGRAMA
                    db.shutdown();
                    
    			}else{
    				System.out.println("\nOpção Invalida!!!");
    			}
    		} while (!opcao.equals("3"));
    			
         } catch (SQLException ex3) {
            ex3.printStackTrace();
         }
         
    }    // fim da main()	
}    // fim da classe Testdb

Muito Obrigado

Bom dia.

Tente alterar as aspas no seu insert:

de

"INSERT INTO sample_table(str_col,num_col) VALUES (" + nome + "," + quilometragem + ")";

para

"INSERT INTO sample_table(str_col,num_col) VALUES (' + nome + ',' + quilometragem + ')";

Creio que precise ser utilizado aspas simples para strings.

[quote=rockstorm]Bom dia.

Tente alterar as aspas no seu insert:

de

"INSERT INTO sample_table(str_col,num_col) VALUES (" + nome + "," + quilometragem + ")";

para

"INSERT INTO sample_table(str_col,num_col) VALUES (' + nome + ',' + quilometragem + ')";

Creio que precise ser utilizado aspas simples para strings.

[/quote]

Não deu certo

eu tentei outra opção e tb não deu certo :

    				//cadastrar um carro e a quilometragem total do carro
            		String nome;
            		String quilometragem;
            		String stu;
            		
        			System.out.println("Qual o nome do carro?");
        			nome = leitor.nextLine();            		
            		
        			System.out.println("Qual o Quilometragem do carro?");
        			quilometragem = leitor.nextLine();
        			
            		//*********** DUVIDA NO INSERT *******************
        			// Quero salvar no banco o conteúdo das variáveis
        			stu = "'INSERT INTO sample_table(str_col,num_col) VALUES (" + nome + "," + quilometragem + ")'";
                    db.update(stu);
                                                                    // nome, quilometragem
                    //************************************************

A troca de aspas é somente nos valores a ser atribuidos no insert, segue abaixo o codigo arrumado.

//cadastrar um carro e a quilometragem total do carro   
            String nome;   
            String quilometragem;   
            String stu;   
               
            System.out.println("Qual o nome do carro?");   
            nome = leitor.nextLine();                     
               
            System.out.println("Qual o Quilometragem do carro?");   
            quilometragem = leitor.nextLine();   
               
            //*********** DUVIDA NO INSERT *******************   
            // Quero salvar no banco o conteúdo das variáveis   
            stu = "INSERT INTO sample_table(str_col,num_col) VALUES (' + nome + ',' + quilometragem + ')";   
            db.update(stu);   
                                                            // nome, quilometragem   
            //************************************************  

somente aqui:

VALUES (' + nome + ',' + quilometragem + ')

tente agora.

Ou pode fazer da seguinte forma:

     StringBuilder stu = new StringBuilder("INSERT INTO sample_table(str_col,num_col) VALUES (") .append(nome).append(quilometragem).append(")");

      db.update(stu.toString);

oi,

tenta usar Prepared Statement e não vai precisar se preocupar com as aspas

abs

A sugestao do andré é valida, mas vc acertando as aspas tudo vai funcionar.

[quote=malves_info]Ou pode fazer da seguinte forma:

[code]
StringBuilder stu = new StringBuilder(“INSERT INTO sample_table(str_col,num_col) VALUES (”) .append(nome).append(quilometragem).append(")");

  db.update(stu.toString);

[/code][/quote]

Agradeço pela ajuda, mas de todas as formas o erro é sempre o mesmo, no erro mostra o valor 6 que é o tamanho da String do nome do carro, muito estranho…

java.sql.SQLException: Unexpected token 6, requires ( in statement [INSERT INTO sample_table(str_col,num_col) VALUES 6]
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source)
at project.MainProject.update(MainProject.java:87)
at project.MainProject.main(MainProject.java:174)

Será que vc não esta passando uma string maior do que foi definido na tabela?

Já tenhei com valores menores e tb apresenta erro.

   PreparedStatement statement = connection.prepareStatement("INSERT INTO sample_table(str_col,num_col) VALUES (?,?)");
   statement.setString(1,nome);
   statement.setInt(2,Integer.parseInt(quilometragem));

   statement.executeUpdate();

[quote=wariows][code]
PreparedStatement statement = connection.prepareStatement(“INSERT INTO sample_table(str_col,num_col) VALUES (?,?)”);
statement.setString(1,nome);
statement.setInt(2,Integer.parseInt(quilometragem));

statement.executeUpdate();
[/code][/quote]

Está apresentando erro na primeira linha:

PreparedStatement statement = connection.prepareStatement("INSERT INTO sample_table(str_col,num_col) VALUES (?,?)"); [/quote]
O Eclipse sublinha em vermelho o nome connection

[quote=massucato][quote=wariows][code]
PreparedStatement statement = connection.prepareStatement(“INSERT INTO sample_table(str_col,num_col) VALUES (?,?)”);
statement.setString(1,nome);
statement.setInt(2,Integer.parseInt(quilometragem));

statement.executeUpdate();
[/code][/quote]

Está apresentando erro na primeira linha:

PreparedStatement statement = connection.prepareStatement("INSERT INTO sample_table(str_col,num_col) VALUES (?,?)"); O Eclipse sublinha em vermelho o nome connection[/quote]

[/quote]

Desculpa, não fui claro… Essa connection provavelmente não tem o mesmo nome no seu código, ela se refere a instancia da conexão com o banco de dados que vc está utilizando… substitua pela sua instância da conexão :wink:

[/quote]

Desculpa, não fui claro… Essa connection provavelmente não tem o mesmo nome no seu código, ela se refere a instancia da conexão com o banco de dados que vc está utilizando… substitua pela sua instância da conexão :wink: [/quote]

Também não deu certo…

    				//cadastrar um carro e a quilometragem total do carro
            		String nome;
            		int quilometragem;
            		String stu;
            		
        			System.out.println("Qual o nome do carro?");
        			nome = leitor.nextLine();            		
            		
        			System.out.println("Qual o Quilometragem do carro?");
        			quilometragem = leitor.nextInt();
        			
            		//*********** DUVIDA NO INSERT *******************
        			// Quero salvar no banco o conteúdo das variáveis
        			       	        
       			    PreparedStatement statement = conn.prepareStatement("INSERT INTO sample_table(str_col,num_col) VALUES (?,?)");
       			    statement.setString(1,nome);
       			    statement.setInt(2,Integer.parseInt(quilometragem));

       			    statement.executeUpdate();

Este código apresenta erro:

java.sql.SQLException: Unexpected token 5, requires ( in statement [INSERT INTO sample_table(str_col,num_col) VALUES 5]
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.jdbcStatement.executeUpdate(Unknown Source)
at project.MainProject.update(MainProject.java:87)
at project.MainProject.main(MainProject.java:174)

Agradeço a ajuda de todos o problema estava no hsqldb, foi voltar um backup do workspace e inserir a query com as aspas corretas que funcionou…

VALEW, abaixo o código correto:

package project;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/**
 * Title:        Testdb
 * Description:  simple hello world db example of a
 *               standalone persistent db application
 *
 *               every time it runs it adds four more rows to sample_table
 *               it does a query and prints the results to standard out
 *
 * Author: Karl Meissner karl@meissnersd.com
 */
public class MainProject {
	private static Scanner leitor = new Scanner(System.in);
	
    static Connection conn;  //our connnection to the db - presist for life of program
	private String opcao;

    // we dont want this garbage collected until we are done
    public MainProject(String db_file_name_prefix) throws Exception {    // note more general exception

        // Load the HSQL Database Engine JDBC driver
        // hsqldb.jar should be in the class path or made part of the current jar
        Class.forName("org.hsqldb.jdbcDriver");

        // connect to the database.   This will load the db files and start the
        // database if it is not alread running.
        // db_file_name_prefix is used to open or create files that hold the state
        // of the db.
        // It can contain directory names relative to the
        // current working directory
        conn = DriverManager.getConnection("jdbc:hsqldb:"
                                           + db_file_name_prefix,    // filenames
                                           "sa",                     // username
                                           "");                      // password
    }

    public void shutdown() throws SQLException {

        Statement st = conn.createStatement();

        // db writes out to files and performs clean shuts down
        // otherwise there will be an unclean shutdown
        // when program ends
        st.execute("SHUTDOWN");
        conn.close();    // if there are no other open connection
    }

//use for SQL command SELECT
    public synchronized void query(String expression) throws SQLException {

        Statement st = null;
        ResultSet rs = null;

        st = conn.createStatement();         // statement objects can be reused with

        // repeated calls to execute but we
        // choose to make a new one each time
        rs = st.executeQuery(expression);    // run the query

        // do something with the result set.
        dump(rs);
        st.close();    // NOTE!! if you close a statement the associated ResultSet is

        // closed too
        // so you should copy the contents to some other object.
        // the result set is invalidated also  if you recycle an Statement
        // and try to execute some other query before the result set has been
        // completely examined.
    }

//use for SQL commands CREATE, DROP, INSERT and UPDATE
    public synchronized void update(String expression) throws SQLException {

        Statement st = null;

        st = conn.createStatement();    // statements

        int i = st.executeUpdate(expression);    // run the query

        if (i == -1) {
            System.out.println("db error : " + expression);
        }

        st.close();
    }    // void update()

    public static void dump(ResultSet rs) throws SQLException {

        // the order of the rows in a cursor
        // are implementation dependent unless you use the SQL ORDER statement
        ResultSetMetaData meta   = rs.getMetaData();
        int               colmax = meta.getColumnCount();
        int               i;
        Object            o = null;

        // the result set is a cursor into the data.  You can only
        // point to one row at a time
        // assume we are pointing to BEFORE the first row
        // rs.next() points to next row and returns true
        // or false if there is no next row, which breaks the loop
        for (; rs.next(); ) {
            for (i = 0; i < colmax; ++i) {
                o = rs.getObject(i + 1);    // Is SQL the first column is indexed

                // with 1 not 0
                System.out.print(o.toString() + " ");
            }

            System.out.println(" ");
        }
    }                                       // void dump( ResultSet rs )

    public static void main(String[] args) {
    	String opcao;
        MainProject db = null;

        try {
            db = new MainProject("db_file.db");
        } catch (Exception ex1) {
            ex1.printStackTrace();    // could not start db
            return;                   // bye bye
        }

        try {

            //make an empty table
            //
            // by declaring the id column IDENTITY, the db will automatically
            // generate unique values for new rows- useful for row keys
            db.update(
                "CREATE TABLE sample_table ( id INTEGER IDENTITY, str_col VARCHAR(256), num_col INTEGER)");
        } catch (SQLException ex2) {

            //ignore
            //ex2.printStackTrace();  // second time we run program
            //  should throw execption since table
            // already there
            //
            // this will have no effect on the db
        }
        try {           	
        	
    		do{
    			System.out.println("\n1. Cadastrar Carro e Quilometragem:");
    			System.out.println("2. Listar os carros cadastrados:");
    			System.out.println("3. Sair");
    			System.out.println("\nEscolha a opçao desejada:");
    			opcao = leitor.nextLine();
    			
    			if(opcao.equals("1")){
    				//cadastrar um carro e a quilometragem total do carro
            		String nome;
            		int quilometragem;
            		String stu;
            		
        			System.out.println("Qual o nome do carro?");
        			nome = leitor.nextLine();            		
            		
        			System.out.println("Qual o Quilometragem do carro?");
        			quilometragem = leitor.nextInt();
        			
        	        stu = "INSERT INTO sample_table(str_col,num_col) VALUES ('" + nome + "'," + quilometragem + ")";   
        	        db.update(stu);
        	        System.out.println("Dados inseridos com sucesso!\n\n");
    			}else if(opcao.equals("2")){   				
                	// listar o conteúdo da tabela                          
                    // do a query
                    System.out.println("DADOS CONTIDOS NA TABELA:\n");
                    db.query("SELECT * FROM sample_table");                                        
    			}else if(opcao.equals("3")){ 				
                    // SAIR DO PROGRAMA
                    db.shutdown();                    
    			}else{
    				//System.out.println("\nOpção Invalida!!!");
    			}
    		} while (!opcao.equals("3"));
    			
         } catch (SQLException ex3) {
            ex3.printStackTrace();
         }
         
    }    // fim da main()	
}    // fim da classe Testdb