2010-04-03 39 views
24

Tôi đang sử dụng cơ sở dữ liệu MySQL và truy cập nó thông qua Java.Trả về số hàng bị ảnh hưởng bởi câu lệnh SQL UPDATE trong Java

PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table 
                   SET Level = 'Super' 
                  WHERE Username = ?"); 
prep1.setString(1, username); 

Tuyên bố cập nhật ở trên hoạt động tốt tuy nhiên tôi muốn nhận được số hàng bị ảnh hưởng với tuyên bố này. Điều này có thể vui lòng không?

Trả lời

36

Calling executeUpdate() trên PreparedStatement bạn nên trả về một int, số lượng hồ sơ được cập nhật.

+0

đáng yêu :) Thanks guys –

+4

Thật sự tôi đang gặp một vấn đề với điều này. Khi tôi chạy bản cập nhật cho một cột có giá trị X và cố gắng cập nhật nó thành X hơn truy vấn mysql thô trả về 0 khi hàng bị ảnh hưởng NHƯNG câu lệnh chuẩn bị java trả về số hàng ngay cả khi X không bao giờ thay đổi. –

+7

Nó không thực sự là số lượng hồ sơ cập nhật, đó là số lượng hồ sơ phù hợp không may. Trong thiết lập của tôi (MySQL), tôi nhận được 1 cho giá trị trả về của executeUpdate() khi cập nhật một giá trị cho cùng một giá trị nhưng khi tôi chạy truy vấn theo cách thủ công trong Workbench, nó nói: 0 hàng (s) bị ảnh hưởng Hàng phù hợp: 1 Đã thay đổi : 0 Cảnh báo: 0 – mikato

1

Con số này được trả về khi bạn chạy các truy vấn:

int rows = prep1.executeUpdate(); 
System.out.printf("%d row(s) updated!", rows); 
0

Nếu cần biết có bao nhiêu hàng sẽ bị ảnh hưởng mà không thực thi, bạn sẽ phải chạy câu lệnh SELECT trước.

30

Statement.executeUpdate() hoặc execute() tiếp theo getUpdateCount() sẽ trả lại số hàng phù hợp, không cập nhật, theo spec JDBC. Nếu bạn muốn số lượng cập nhật, bạn có thể chỉ định useAffectedRows=true làm non-standard URL option. Thông tin thêm có sẵn here.

+6

Đây là câu trả lời đúng, chấp nhận một câu trả lời sai. – Wrench

+0

Thật không may, liên kết O'Reilly đã chết ... – amaidment

+0

@amaidment: Cảm ơn bạn đã cho tôi biết. Tôi đã thay thế liên kết bằng một từ Lưu trữ Internet. –

0

Số hàng bị ảnh hưởng bởi SQL Update có thể được trả lại sử dụng SQL% ROWCOUNT (Đối với ORACLE) hoặc @@ ROWCOUNT (CHO SQL SERVER)

Lưu ý: Để trả lại số hàng được cập nhật, xóa, vv .. chúng ta phải sử dụng OUT Parameter trong Stored Procedure mà sẽ lưu trữ số lượng hàng được cập nhật, xóa vv ..

  1. để có được số lượng hàng được cập nhật, xóa vv .. chúng ta phải sử dụng registerOutParameter phương pháp trong Java

  2. Để lưu trữ số hàng được cập nhật hoặc xóa vv .. vào một trong các tham số OUTOUT trong thủ tục lưu sẵn, chúng ta phải đặt kiểu tham số trong tập lệnh trước khi thực hiện lệnh. (Trong trường hợp Update hoặc xóa nó sẽ NUMERIC)

  3. Khi lệnh được thực thi, lưu trữ các giá trị cập nhật hoặc xóa hàng vào biến (Nó có thể biến mới hoặc biến sẵn trong lớp vv .) bằng cách gọi chỉ mục của tham số đó (ví dụ: A = cs.getInt (3) nếu tham số OUT trong quy trình được lưu trữ là Tham số thứ 2)

  4. Bây giờ, biến có giá trị Cập nhật hoặc xóa hàng (ieA = 10)

Ví dụ cho porcedure Stored

Function demo(A varchar2(10), B OUT NUMBER)RETURN NUMBER IS EXIST_LP NUMBER; 
BEGIN 
UPDATE demo_temp SET name=A where name="ABC"; 
B:=SQL%ROWCOUNT -- total number of rows updated 
RETRUN EXIST_LP; 
END demo; 

Ví dụ về kịch bản java

public void update(demo demo){ 
int rowCount = 0; 
Connection conn = null; 
CallableStatement cs = null; 
try{ 
InitialContext ctx = new InitialContext(); 
DataSource ds = (DataSource) ctx.lookup("your data source path"); 
conn = ds.getConnection(); 
cs = conn.prepareCall("BEGIN ? :=demo_dbp.demo(?,?)); END;"); // stored proc 
cs.registerOutParameter(1, Types.INTEGER); 
cs.setString(2, "XYZ"); 
cs.registerOutParameter(3, Types.NUMERIC); 
rowCount=cs.execcuteUpdate(); 
demo.setUpdateCount(cs.getInt(3)); 
} catch (SQLException exc) { 
    throw new DaoException("An SQL Exception has occurred.", exc); 
} catch (NamingException ne) { 
    throw new DaoException("A Naming Exception has occurred.", ne); 
} catch (Exception e) { 
    throw new DaoException("An Exception has occurred", e); 
} finally { 

    try { 
      if (cs != null) { 
       cs.close(); 
      } 
} catch (SQLException ex1) { 
} 
try { 
      if (conn != null) { 
       conn.close(); 
      } 
} catch (SQLException ex) { 
} 

} 
} 

Lưu ý: executeUpdate() không trả lại số hàng được cập nhật hoặc xóa.Nó chỉ trả về 0 hoặc 1.

  1. 0 - Thi Không
  2. 1 - Thực hiện thành công
1

Nhìn vào này chỉ là bây giờ cho một tình huống tương tự, nơi tôi chỉ muốn làm công việc bổ sung nếu có điều gì thực sự thay đổi, tôi nghĩ rằng nền tảng cách trung lập nhất để làm điều đó sẽ thay đổi các truy vấn để loại trừ trường hợp các lĩnh vực thiết lập phù hợp:

UPDATE user_table SET Level = 'Super' WHERE Username = ? AND Level <> 'Super' 
+0

Làm cách nào để trả lời câu hỏi của OP? –

+0

Dễ dàng, bạn phải thêm các điều kiện bổ sung vào mệnh đề where để giới hạn số hàng được trả về giống với số hàng bị ảnh hưởng. (Ít nhất là để làm việc trong máy khách java của mình) –

+0

Tôi hiểu. Vấn đề tôi đưa ra là câu hỏi yêu cầu _how_ lấy lại số đó trong Java. Câu trả lời của bạn không giải thích được (xem câu trả lời được chấp nhận, _does_ giải thích điều này). Tuy nhiên, đánh giá từ các ý kiến ​​có vẻ như câu trả lời của bạn có thể là một phụ lục tốt cho câu trả lời được chấp nhận. –

1
  1. Trước hết, hãy chuẩn bị đối tượng 'PreparedStatement' sử dụng dưới đây constructor:

    PreparedStatement pStmt = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 
    //here variable 'sql' is your query ("UPDATE user_table SET Level = 'Super' WHERE Username = ?") 
    
  2. Sau đó, thiết lập tham số của bạn để 'pStmt'. Trong trường hợp này:

    prep1.setString(1, username); 
    
  3. hàng Cuối cùng, executeUpdate và bị ảnh hưởng như một số nguyên

    int affectedRows = pStmt.executeUpdate(); 
    
+0

tại sao không ai bỏ phiếu cho mã này? – gumuruh

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