エラーの処理
Microsoft JDBC Driver for SQL Server の使用時に発生するデータベース エラー状態はすべて、SQLServerException クラスを使用して、Java アプリケーションに例外として返されます。 SQLServerException クラスの次のメソッドは、java.sql.SQLException および java.lang.Throwable から継承されます。これらのメソッドを使用して、発生した SQL Server エラーに関する特定の情報を返すことができます。
getSQLState()
は、例外の標準的な X/Open または SQL99 状態コードを返します。getErrorCode()
は、具体的なデータベース エラー番号を返します。getMessage()
は、例外の全文を返します。 エラー メッセージ テキストは、問題を説明しており、多くの場合、オブジェクト名のような情報のプレースホルダーが含まれます。このようなプレースホルダーは、表示されたエラー メッセージに挿入されています。getSQLServerError()
は、SQL Server から受信した例外に関する詳細情報を含むSQLServerError
オブジェクトを返します。 サーバー エラーが発生しなかった場合、このメソッドは null 値を返します。
SQLServerError
クラスの次のメソッドは、生成されたエラーに関するその他の情報をサーバーから取得するために使用できます。
SQLServerError.getErrorMessage()
は、サーバーから受信したエラー メッセージを返します。SQLServerError.getErrorNumber()
は、エラーの種類を識別する数値を返します。SQLServerError.getErrorState()
は、エラー、警告、または "データが見つかりません" メッセージを表す SQL Server の数値エラー コードを返します。SQLServerError.getErrorSeverity()
は、受信したエラーの重大度レベルを返します。SQLServerError.getServerName()
は、エラーを生成した SQL Server インスタンスを実行しているコンピューターの名前を返します。SQLServerError.getProcedureName()
は、エラーを生成したストアド プロシージャの名前またはリモート プロシージャ呼び出し (RPC) の名前を返します。SQLServerError.getLineNumber()
は、Transact-SQL コマンドのバッチまたはストアド プロシージャ内の、エラーが生成された行番号を示します。
次の例の関数は、SQL Server AdventureWorks2022 サンプル データベースに対して開かれた接続を渡され、FROM 句のない、形式に誤りがある SQL ステートメントを作成します。 次に、ステートメントが実行され、SQL 例外が処理されます。
public static void executeSQLException(Connection con) {
try (Statement stmt = con.createStatement();) {
String SQL = "SELECT TOP 10 * Person.Contact";
ResultSet rs = stmt.executeQuery(SQL);
while (rs.next()) {
System.out.println(rs.getString("FirstName") + " " + rs.getString("LastName"));
}
}
catch (SQLException se) {
do {
System.out.println("SQL STATE: " + se.getSQLState());
System.out.println("ERROR CODE: " + se.getErrorCode());
System.out.println("MESSAGE: " + se.getMessage());
System.out.println();
}
while (se != null);
}
}
ServerMessageHandler の使用
リリース 12.8.0 以降、ドライバーには追加の ServerMessageHandler
があり、エラーフィードバックとログ記録の幅広い制御が可能になりました。 ServerMessageHandler
を使用するには、ISQLServerMessageHandler
インターフェイスを実装する必要があります。 ServerMessageHandler
には次のような機能があります。
メッセージのフィードバック
実行時間の長いクエリからフィードバック (進行状況メッセージなど) を受け取ることができます。 例: RAISERROR ('Progress message...', 0, 1) WITH NOWAIT
。
ユニバーサル エラー ログ記録
メッセージ ハンドラーがすべてのエラーのログ記録を処理できるようにします。
ユニバーサル エラー処理
アプリケーション全体で同じエラー処理を繰り返すのではなく、エラー処理ロジックを ServerMessageHandler
に置くだけで済みます。
エラー メッセージの重大度の再マップ
特定のエラー メッセージの重大度を次のように認識および変更できます。
SQLServerError.toSQLServerInfoMessage()
を指定すると、エラー メッセージを情報メッセージにダウングレードして作成されたISQLServerMessage
が返されます。SQLServerError.toSQLServerInfoMessage(int newErrorSeverity)
を指定すると、エラー メッセージを情報メッセージにダウングレードして作成されたISQLServerMessage
が新しいエラー重大度で返されます。SQLServerError.toSQLServerInfoMessage(int newErrorSeverity, int newErrorNumber)
を指定すると、エラー メッセージを情報メッセージにダウングレードして作成されたISQLServerMessage
が新しいエラー重大度とエラー番号で返されます。SQLServerInfoMessage.toSQLServerError()
を指定すると、情報メッセージをエラー メッセージにアップグレードして作成されたISQLServerMessage
が返されます。SQLServerInfoMessage.toSQLServerError(int newErrorSeverity)
を指定すると、情報メッセージをエラー メッセージにアップグレードして作成されたISQLServerMessage
が新しいエラー重大度で返されます。SQLServerInfoMessage.toSQLServerError(int newErrorSeverity, int newErrorNumber)
を指定すると、情報メッセージをエラー メッセージにアップグレードして作成されたISQLServerMessage
が新しいエラー重大度とエラー番号で返されます。
SQLExceptionChaining
また、リリース 12.8.0 では、SQLException を連結できるため、最終的な例外メッセージには、連結しないと失われる可能性のあるすべての例外が自動的に含まれます。 この機能は、既定で有効になっています。