1. 程式人生 > 資料庫 >JDBC探索之SQLException解析

JDBC探索之SQLException解析

1. SQLException 的概述

當使用 JDBC 與資料來源(在本文中的資料來源表示我們實際使用的資料庫)進行互動的時候遇見錯誤的時候,將會丟擲名為 SQLException 的異常。一個 SQLException 的異常裡面包含以下資訊,用於幫助我們更好的定位錯誤。

錯誤表示:

使用 getMessage 方法便可以獲取。

SQLState 程式碼

程式碼有五位的字母和數字組成 。多數的程式碼由 ISO/ANSI 和 Open Group(X/Open) 標準化,但是仍然存在部分的程式碼由資料庫提供商自行實現。

使用 getSQLState 方法便可以獲取。

錯誤程式碼

與 SQLState 不同,錯誤程式碼是由資料庫提供商自行定義的整數值,存在是由基礎資料來源返回的實際錯誤程式碼的可能。

使用 getErrorCode 方法便可以獲取。

錯誤原因

表示引發異常的原因,通過不斷呼叫 getCause 方法可以獲取異常發生的底層原因。

異常鏈

如果出現多個錯誤,則通過此鏈引用異常。

使用 getNextException 方法便可以獲取。

2. SQLException的示例

public static void printSQLException(SQLException e){
  for(Throwable e :ex){
    if (e instanceof SQLException){
      if(ignoreSQLException(((SQLException)e).getSQLState()) == false){
        e.printStackTrace(System.err);
        System.err.println("SQLState:" + ((SQLException)e).getSQLState());
        System.err.println("Error Code:" + ((SQLException)e).getErrorCode());
        System.err.println("Message:" + e.getMessage());
        Throwable t = ex.getCause();
        while(t != null){
          System.out.println("Cause :" + t);
          t = t.getCause();
        }
      }
    }
  }
}
public static boolean ignoreSQLException(String sqlState){
  if(sqlState == null){
    System.out.println("The SQL state is not defined");
  }
  // X0Y32:Jar file already exists in schema
  if(sqlState.equalsIgnoreCase("X0Y32")){
    return true;
  }
  // 42Y55:Table already exists in schema
  if(sqlState.equalsIgnoreCase("42Y55")){
    return true;
  }
  return true;
}

說明:上面的程式碼取自 [http:docs.oracle.com] (http://docs.oracle.com/javase/tutorial/jdbc/basics/sqlexception.html)。

3. SQLWarning

SQLWarning 是 SQLException 的一個非常重要的子類,用於表示資料庫訪問時出現的警告。作為異常,SQLWarning 不會停止執行應用程式,而是提醒使用者沒有按計劃發生任何事情。比如,警告有可能會通知你嘗試撤銷的某個許可權沒有成功,或者通知你在請求斷開的時間可能發生錯誤。

SQLWarning 有可能被 Connection 、Statement (包括 PreparedStatement 和 CallableStatement)或 ResultSet 報告,這些類都存在 getWarnings 方法,通過呼叫該方法才能看到呼叫物件上報告的第一個警告。如果 getWarning 返回一個警告,我們可以呼叫其 getNextWarning 方法獲取下一個警告。每執行一行語句,那麼前面那行語句的警告將會清除,這意味著如果我們想要檢索報告處理來的警告,那麼必須在下一行語句執行之前檢索。

DataTruncation 是最常見的警告,其SQLState程式碼均為01004,表示在讀取和寫入資料的時候存在問題。DataTruncation 有很多方法可以幫助我們去理解哪個列或引數資料被截斷,截斷是在讀取還是寫入操作,應該傳輸多少位元組以及實際傳輸的位元組數。

4. 其他型別的SQLException

BatchUpdateException:在批處理更新操作期間發生錯誤時,將引發除了所提供的資訊,提供的更新計數被處死之前出現了錯誤的所有語句。

SQLClientInfoException:當無法在連線上設定一個或多個客戶端資訊屬性時引發。除了所提供的資訊,也提供了不設定的客戶端資訊屬性的列表。

so on...

總結

以上就是本文關於JDBC探索之SQLException解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站:JDBC常用介面總結、使用JDBC實現資料訪問物件層(DAO)程式碼示例等,有什麼問題可以隨時留言,小編會及時回覆大家的,歡迎大家留言交流討論。