2009-09-24 32 views
13

Làm cách nào để tạo SQLExceptions được trình điều khiển JDBC của DB2 đưa ra mô tả hơn?Làm thế nào để làm cho các SQLExceptions JDBC cho DB2 có tính mô tả hơn?

Hiện tại tôi nhận được loại ngoại lệ này. Nó là cồng kềnh để làm việc với các giá trị số SQLCODE và SQLSTATE khó hiểu này. Có cách nào để làm cho ngoại lệ SQL có chứa mô tả mã không.

Caused by: com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -302, 
    SQLSTATE: 22001, SQLERRMC: null 
     at com.ibm.db2.jcc.b.hh.c(hh.java:1662) 
     at com.ibm.db2.jcc.b.hh.a(hh.java:1238) 
     at com.ibm.db2.jcc.c.db.n(db.java:737) 
     .... 

ví dụ: SQLSTATE 22001 có mô tả này:

Dữ liệu ký tự, cắt xén phải xảy ra; ví dụ, một giá trị cập nhật hoặc chèn là một chuỗi quá dài cho cột, hoặc một giá trị datetime không thể được gán cho một biến chủ, bởi vì nó quá nhỏ.

Chỉnh sửa: Tôi cũng đang sử dụng khung công tác Spring và Hibernate.

+0

Nó sẽ là tuyệt vời để kiểm tra các giải pháp cho câu hỏi của bạn :-) – andy

Trả lời

3

Mùa xuân chứa translators cho SQLException chuyển đổi mã và mã cụ thể của cơ sở dữ liệu thành một phân cấp lớp ngoại lệ mô tả.

Đó là một phần của API Spring lớn hơn, nhưng không có gì ngăn bạn chỉ sử dụng lớp đó.


Ví dụ, nếu bạn có một DAO kéo dài JdbcDaoSupport, sau đó bạn có thể có mã như thế này:

try { 
    // ... some code that throws SQLException 
} catch (SQLException ex) { 
    throw getExceptionTranslator().translate(null, null, ex); 
} 

này dịch và kết thúc tốt đẹp SQLException là hệ thống phân cấp ngoại lệ gõ mạnh riêng của Spring.

Nếu bạn không sử dụng JdbcDaoSupport, sau đó bạn có thể sử dụng phương pháp getExceptionTranslator() của JdbcTemplate (và nếu bạn không sử dụng đó, sau đó nhìn vào nguồn để xem cách nó hoạt động.)

10
  1. Kiểm tra xem ngoại lệ có thực hiện com.ibm.db2.jcc.DB2Diagnosable

  2. Trên DB2Diagnosable, bạn có thể gọi getSqlca() để nhận DB2Sqlca. Nó sẽ trả về mã lỗi SQL (getSqlCode()), trạng thái (getSqlState()) và bạn có thể gọi getMessage() để nhận được thông báo lỗi được định dạng và dễ đọc.

Có lẽ một lý do thông minh khiến IBM không lập bản đồ này thành getMessage() ngoại lệ. Tôi đoán là họ không vì DB2Sqlca.getMessage() có thể ném ngoại lệ khó chịu, vì vậy bạn phải quấn nó trong try-catch.

17

Đặt thuộc tính trình điều khiển JDBC retrieveMessagesFromServerOnGetMessage thành true. url kết nối Ví dụ:

jdbc:db2://host:50128/MYDB:retrieveMessagesFromServerOnGetMessage=true; 

Xem thêm DB2 11.1 Documentation

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