8.1 SQLException
一個SQLException實例異常拋出 當和數(shù)據(jù)源交互的過程中出現(xiàn)錯誤時,該異常包含以下信息:
- 描繪錯誤的原文: String 包含了 描繪異常的信息 當調(diào)用 SQLException.getMessage 方法時
- SQL 狀態(tài):Srtring 包含了SQL 狀態(tài),當調(diào)用 SQLException.getSQLState 方法時
- 錯誤碼:這是一個標志錯誤的 integer 類型的值,它的值是依賴于特的的實現(xiàn)的,也可能是底層數(shù)據(jù)源返回的實際錯誤代碼,錯誤代碼可以使用SQLException.getErrorCode方法檢索
- 原因:這是一種人為的拋出導致 SQLException 發(fā)生
- 異常鏈:如果發(fā)生多個錯誤,則可以通過引用異常鏈,所有的異常鏈都可以通過 SQLException.getNextException 去獲得,假如沒有更多的異常鏈了 則 getNextException 方法返回 null
8.2 對于java SE支持鏈式execeptions
SqlException類及其子類已增強為java SE支持鏈式異常能力,支持此功能的更改如下:
- 添加四個構造函數(shù)以提供原因參數(shù)的支持
- getCause 方法 除了 返回 SQLExceptions 還可能返回 Non-SQLExceptions
有關附加信息,請參閱JDBC API規(guī)范
8.3 導航 SQLException
在執(zhí)行SQL語句時可能會出現(xiàn)一個或多個異常,每個異常都有各自潛在的因果關系。這就意味著當一個JDBC應用捕獲一個SQLException,有一種可能性,可能會有額外的SQLException拴在原拋出SQLException。訪問附加鏈接的SQLException,申請將遞歸調(diào)用getnextexception直到返回空值
一個 SQLException 可能會出現(xiàn)因果關系 ,由一個或多個 SQLException 拋出造成的。你可以遞歸調(diào)用sqlexception.getcause 方法,直到返回空值,
下面的代碼演示了應用程序如何瀏覽sqlexception及其原因:
catch(SQLException ex) {
while(ex != null) {
System.out.println("SQLState:" + ex.getSQLState());
System.out.println("Error Code:" + ex.getErrorCode());
System.out.println("Message:" + ex.getMessage());
Throwable t = ex.getCause();
while(t != null) {
System.out.println("Cause:" + t);
t = t.getCause();
}
ex = ex.getNextException();
}
}
8.4 使用 For-Each 循環(huán) 對于 SQLException
JDBC 異??赡軙褂?JavaSE For-Each 循環(huán) 來導航 SQLException 以及 它們之間的關系
catch(SQLException ex) {
for(Throwable e : ex ) {
System.out.println("Error encountered: " + e);
}
}
8.5 SQLWarning
SQLWarning 是 SQLException 的子類,下面的接口方法將產(chǎn)生一個sqlwarning對象如果他們遇到一個數(shù)據(jù)庫訪問的警告:
- Connection
- DataSet
- Statement
- ResultSet
當一個方法產(chǎn)生一個sqlwarning對象,調(diào)用者不了解數(shù)據(jù)訪問的警告。該方法必須調(diào)用適當getWarnings對象檢索SQLWarning對象。然而,對sqlwarning的datatruncation子類可以被扔在某些情況下,見8.3節(jié)“datatruncation”頁上的8-46詳情
如果多個數(shù)據(jù)訪問的警告時,它們會是在第一個,可以通過遞歸調(diào)用sqlwarning.getnextwarning方法檢索。如果有鏈中沒有更多的警告,getnextwarning返回null
8.6 數(shù)據(jù)截斷
DataTruncation 是 SQLWarning 的子類,提供信息當數(shù)據(jù)截斷的時候,當數(shù)據(jù)源寫入數(shù)據(jù)時發(fā)生數(shù)據(jù)截斷,一個 DataTruncation 對象會被拋出,即使已經(jīng)生成警告,已截斷的數(shù)據(jù)值也已寫入數(shù)據(jù)源。從數(shù)據(jù)源讀取數(shù)據(jù)時發(fā)生截斷,會報告一個 SQLWarning
一個datatruncation對象包含以下信息:
- 描繪的字符串 "Data truncation"
- SQLState "01004" 當 從數(shù)據(jù)源讀取數(shù)據(jù)時發(fā)生截斷
- SQLState "22001" 當數(shù)據(jù)源寫入數(shù)據(jù)時發(fā)生數(shù)據(jù)截斷
- 一個 boolean 指示值是否截斷為參數(shù)值或列值。
- 給出截斷的列或參數(shù)的索引的int 類型值,如果列的索引值或參數(shù)是未知的,該方法datatruncation.getindex返回-1,如果索引是未知的,會返回值datatruncation.getparameter和datatruncation.getread 是未定義 的
- 一個布爾值,用來指示截斷是在讀還是寫操作上發(fā)生的。如果datatruncation.getread截斷發(fā)生在讀,則返回 true,如果datatruncation.getread截斷發(fā)生在寫,則返回 false
- 方法datatruncation.getdatasize返回int,表示數(shù)據(jù)應該已經(jīng)傳送的字節(jié)數(shù)。如果數(shù)據(jù)轉換正在執(zhí)行,這個數(shù)字可能是近似的。如果大小未知,則值可能是1
- 方法datatruncation.gettransfersize返回實際轉換的字節(jié) 或 如果字節(jié)數(shù)為-1 則是未知的
8.7 靜止的截斷(Silent Truncation)
statement.setmaxfieldsize方法允許的最大大?。ㄒ宰止?jié)為單位)是集。此限制僅適用于二進制、varbinary、LONGVARBINARY、CHAR、LONGVARCHAR、nchar、nvarchar varchar數(shù)據(jù)類型,和LONGNVARCHAR
如果使用setmaxfieldsize設定了最大限制,試圖去讀取超過限制的數(shù)據(jù)時,由于超過規(guī)定的極限,任何截斷不會報道
8.8 BatchUpdateException
一個batchupdateexception對象提供有關發(fā)生在批處理語句被執(zhí)行的錯誤信息。這個異常的行為在第14章“批處理更新”中描述
8.9 SQLClientinfoException
SQLClientInfoException 會拋出通過Connection.setClientInfo 方法 發(fā)生在 設置一個 或更多個 指定 的客戶端 properties 失敗時,sqlclientinfoexception包含信息指示客戶端properties 屬性沒有設置。