2013-09-08 37 views
7

tôi đã cố gắng để chèn một userId (int) và một userName (String) bằng cách sử dụng PreparedStatement sử dụng JDBC sử dụng phương pháp sau đây:MySQLSyntaxErrorException khi cố gắng thực hiện 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; 
} 

tôi nhận được stacktrace sau:

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 

Tôi đang làm gì sai?

+1

Điều này không có ý nghĩa, vì lỗi "sử dụng gần"? Id =? ' "không jive với câu lệnh SQL. – OldProgrammer

+0

Hiển thị bảng tạo câu lệnh cho testtable –

+0

tạo bảng kiểm tra (id số nguyên, tên char (50)); – bhattedon

Trả lời

13

Hãy thử này này nên làm việc:

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 là tuyên bố biên dịch sẵn. bạn không cần phải cung cấp chuỗi sql trong khi thực hiện.

+1

Tôi mất một giờ để hiểu rằng bạn ** KHÔNG PHẢI ** chuyển truy vấn sql của bạn tới 'statement.execute()' khi sử dụng 'PreparedStatement'. Đây là một sự vi phạm [Thiết kế theo hợp đồng] (http://en.wikipedia.org/wiki/Design_by_contract) – Abbas

5

Có lỗi cơ bản trong mã của bạn.

Khi PreparedStatement được tạo ra, chúng ta cần phải gọi preparedStatement.executeUpdate(); với ra đi một lần nữa SQL

Đây là mã đầy đủ cho câu hỏi của bạn.

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")); 
    } 
} 

Kịch bản bảng được đưa ra dưới đây.

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

Tôi đã thử sử dụng 'executeUpdate()', nhưng nó không hoạt động – bhattedon

+0

Bạn có thể chạy cùng một chương trình không những gì tôi đã đưa ra? Mã được kiểm tra. – SmartTechie

+0

Bạn có thể chạy cùng một chương trình mà tôi đã cung cấp không? Mã được kiểm tra. Bất cứ khi nào có sẵn một đoạn mã, hãy thử so sánh mã. Vì vậy, bạn sẽ tìm thấy sự khác biệt. Trong mã tôi đã nói, sử dụng phương thức executeUpdate(). Nếu bạn quan sát điều đó, tôi không đi qua sql một lần nữa. – SmartTechie

Các vấn đề liên quan