2013-09-08 3 views
7

Я попытался вставить USERID (INT) и имя пользователя (String) с помощью PreparedStatement с помощью JDBC, используя следующий метод:MySQLSyntaxErrorException при попытке выполнить PreparedStatement

public boolean saveUser(int userId, String userName){ 
    boolean saveStatus = false; 
    try { 
     connection.setAutoCommit(true); 
     String sql = "insert into testtable values(?,?)"; 
     PreparedStatement statement = connection.prepareStatement(sql); 
     statement.setInt(1, userId); 
     statement.setString(2, userName); 
     saveStatus = statement.execute(sql); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    }finally{ 
     Connector.closeConnections(); 
    } 
    return saveStatus; 
} 

я получаю следующую трассировку стека:

com.mysql.jdbc.exceptions.jdbc4.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 '?,?)' at line 1 

Что я делаю неправильно?

+1

Это не имеет никакого смысла, поскольку ошибка "use near"? Where id =? ' msgstr "не jive с оператором SQL. – OldProgrammer

+0

Покажите нам инструкцию create table для testtable –

+0

create table testtable (id integer, name char (50)); – bhattedon

ответ

13

Попробуйте это должно работать:

try { 
     connection.setAutoCommit(true); 
     String sql = "insert into testtable values(?,?)"; 
     PreparedStatement statement = connection.prepareStatement(sql); 
     statement.setInt(1, userId); 
     statement.setString(2, userName); 
     saveStatus = statement.execute(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return saveStatus; 
} 

PreparedStatement прекомпилируется заявление. вам не нужно указывать строку sql во время выполнения.

+1

Мне потребовался час, чтобы выяснить, что вы ** НЕ ДОЛЖНЫ ** передавать свой sql-запрос в 'statement.execute()' при использовании 'PreparedStatement'. Это нарушение [Дизайн по контракту] (http://en.wikipedia.org/wiki/Design_by_contract) – Abbas

5

В коде есть фундаментальная ошибка.

PreparedStatement После того, как будет создан, нам нужно вызвать preparedStatement.executeUpdate(); с снова проходя SQL

Вот полный код вашего вопроса.

import java.sql.Connection; 
import java.sql.Driver; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 


public class SampleMysql { 

    public static Connection getConnection() throws SQLException { 
     Driver drv = new com.mysql.jdbc.Driver(); 
     DriverManager.registerDriver(drv); 
     Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sample","sample", "sample"); 
     return con; 
    } 

    public static int saveUser(int userId, String userName){ 
     int saveStatus = 0; 
     Connection connection = null; 
     try { 
      connection = getConnection(); 
      connection.setAutoCommit(true); 
      String sql = "INSERT INTO testtable VALUES(?,?)"; 
      PreparedStatement preparedStatement = connection.prepareStatement(sql); 
      preparedStatement.setInt(1, userId); 
      preparedStatement.setString(2, userName); 
      saveStatus = preparedStatement.executeUpdate(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     }finally{ 
      if (connection != null) { 
       try { 
        connection.close(); 
       } catch (SQLException e) { 

        e.printStackTrace(); 
       } 
      } 
     } 
     return saveStatus; 
    } 

    public static void main(String[] a) { 
     System.out.println(saveUser(1, "sample")); 
    } 
} 

Ниже приведен сценарий таблицы.

CREATE TABLE testtable(user_ID INT(10), user_name VARCHAR(10)); 
+0

Я также пытался использовать 'executeUpdate()', но он не работал – bhattedon

+0

Можете ли вы запустить ту же программу что я дал? Код проверен. – SmartTechie

+0

Можете ли вы запустить ту же программу, что я дал? Код проверен. Всякий раз, когда имеется фрагмент кода, попробуйте сравнить код. Таким образом, вы найдете разницу. В коде, который я сказал, используйте метод executeUpdate(). Если вы заметите это, я больше не буду передавать sql. – SmartTechie

Смежные вопросы