2011-06-23 39 views

Trả lời

3
Connection connection = null; 
    PreparedStatement preparedStatement = null; 
    ResultSet generatedKeys = null; 

    try { 
     connection = m_Connection; 
     preparedStatement = (PreparedStatement) connection.prepareStatement(qString, Statement.RETURN_GENERATED_KEYS); 

     // ... 

     int affectedRows = preparedStatement.executeUpdate(); 
     if (affectedRows == 0) { 
      throw new SQLException("Creating user failed, no rows affected."); 
     } 

     generatedKeys = preparedStatement.getGeneratedKeys(); 
     int id = -1; 
     if (generatedKeys.next()) { 
      id = generatedKeys.getInt(1); 
      id = -1; 
     } else { 
      throw new SQLException("Creating user failed, no generated key obtained."); 
     } 
    } finally { 

    } 
19

Bạn sẽ cần phải sử dụng các phương thức executeUpdate() để thực hiện các câu lệnh INSERT, trong khi bạn sẽ cần phải sử dụng phương thức executeQuery() để thực hiện câu lệnh SELECT. Điều này là do các yêu cầu áp đặt bởi các đặc điểm kỹ thuật JDBC trên tập quán của họ:

Từ các tài liệu Java API cho Statement.executeQuery():

Thực thi các câu lệnh SQL nào đó, mà trả về một đối tượng ResultSet duy nhất.

Tham số:

sql - một câu lệnh SQL được gửi đến các cơ sở dữ liệu, thường là một SQL tĩnh SELECT tuyên bố

và từ các tài liệu Java API cho Statement.executeUpdate():

Thực hiện câu lệnh SQL đã cho, có thể là câu lệnh INSERT, UPDATE hoặc DELETE hoặc câu lệnh SQL trả về không có gì, chẳng hạn như câu lệnh SQL DDL.

Tham số:

sql - một SQL dữ liệu Manipulation Language (DML) tuyên bố như INSERT, UPDATE hay DELETE; hoặc câu lệnh SQL trả về không có gì, chẳng hạn như tuyên bố DDL.

Mã của bạn (pseudo-code được đăng ở đây) sẽ xuất hiện như:

statement.executeUpdate("INSERT INTO Sessions(id_user) VALUES(1)"); // DML operation 
statement.executeQuery("SELECT LAST_INSERT_ID()"); // SELECT operation 

Và tất nhiên, MySQL documentation demonstrates how to perform the same activity for AUTO_INCREMENT columns, đó là rõ ràng những gì bạn cần.

Nếu bạn cần phải thực hiện cả hai chúng lại với nhau trong cùng một giao dịch, bằng cách gửi các báo cáo trong một chuỗi với một dấu chấm phẩy tách chúng như sau:

statement.execute("INSERT INTO Sessions(id_user) VALUES(1); SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;"); 

sau đó bạn sẽ cần phải sử dụng phương thức execute(). Lưu ý rằng điều này phụ thuộc vào sự hỗ trợ được cung cấp bởi Cơ sở dữ liệu và trình điều khiển JDBC cho các câu lệnh ghép nối với nhau trong một lần thực thi(). Điều này được hỗ trợ trong Sybase và MSSQL Server, nhưng tôi không nghĩ rằng nó được hỗ trợ trong MySQL.

+0

Trong MySQL, bạn có thể làm giao dịch bằng cách làm 'thực hiện ("bắt đầu giao dịch") 'ngay từ đầu và khi tất cả được thực hiện' execute ("commit") 'để commit hoặc' execute ("rollback") 'để hủy bỏ. Thao tác này sẽ ghi đè bất kỳ cài đặt 'autocommit' nào bạn có thể có cho kết nối. ** Chỉ dành cho động cơ hỗ trợ giao dịch, ví dụ: InnoDB ** – Johan

+0

@Johan, đúng vậy. Tôi đã không chắc chắn nếu đó là có thể bằng cách sử dụng JDBC, nơi người ta có thể sử dụng 'Connection.setAutoCommit (false);' và do đó tôi bỏ qua điều đó. Ngoài ra, vấn đề là rõ ràng trong việc sử dụng 'executeQuery' và' executeUpdate'. –

7

có thể bạn đang sử dụng executeQuery() nhưng để thao tác dữ liệu bạn thực sự cần executeUpdate() chứ không phải là executeQuery()

+0

Giải quyết vấn đề của tôi cảm ơn bạn rất nhiều !!!! – Darrell

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