涙と痛み
Java プログラムの実行中にエラーが発生する場合があります。データベースを操作すると、エラーが発生します。重要なのは、どれを予測して適切な解決策を提供できるかです。
この行を実行すると、最初の大きなエラー グループが待機します。
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
ここで何が期待できますか?
エラー 1。ドライバーが見つかりません。
「…に適したドライバーが見つかりません」というエラーが表示された場合は、DriverManager が URL の背後にある DBMS の種類を理解できなかったことを意味します。たとえば、jdbc:mysql の代わりに jdbc_mysql: を記述したとします。
エラー 2。接続エラー。
ホスト名を間違えると、「そのようなホストは認識されません」または「通信リンク障害」のようなメッセージが表示される可能性があります。
エラー 3。データベース名が正しくありません。
データベース名のスペルを間違えた場合、またはデータベースが存在しない別のサーバーに接続した場合は、「不明なデータベース 'supershop3'」のようなメッセージが表示されます。
エラー 4.ログインまたはパスワードが間違っています。
データベースのパスワードを忘れた場合、または間違って入力した場合は、「ユーザー 'root'@'localhost' のアクセスが拒否されました (パスワードを使用: YES)」のようなメッセージが表示される可能性があります。
SQL例外
それでもベースへの接続が確立されている場合は、さらに興味深いものになります。データベースの操作中にエラーが発生した場合、JDBC には特別な例外java.sql.SQLExceptionがあります。同様に、その品種のいくつか。
この例外には、(Exception クラスと比較して) 追加メソッドが 1 つだけあります。getSQLState() メソッドは、SQL サーバーから返されたステータス コード (文字列) を返します。エラー処理は次のようになります。
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
try {
int rowsCount = statement.executeUpdate("DELETE FROM ‘Unemployees’");
} catch (SQLException ex) {
// If table doesn't exist
if (ex.getSQLState().compareTo("X0Y32") != 0) {
throw ex;
}
} finally {
connection.close();
}
何百ものエラーコードがあります。完全なリストはここでご覧いただけます。
ただし、エラー コードによって JDBC がエラーをよりよく理解できるようになり、SQLException だけでなく特殊な SQLException がスローされる場合があります。
バッチ更新例外 | グループリクエスト中のエラー |
データの切り捨て | 長いデータを切り捨てるときによく発生します |
SQLClientInfoException | クライアントが接続に設定できないパラメータを渡しました: 接続 |
SQLDataException | データのエラー。詳細は DBMS の種類によって異なります |
SQL例外 | データベースアクセスエラーまたはその他の一般的なエラー |
SQLFeatureNotSupportedException | DBMS はこの機能をサポートしていません |
SQLIntegrityConstraintViolationException | SQLState ==22 のすべてのエラー |
SQLInvalidAuthorizationSpecException | アクセスおよび/または認証エラー |
SQLNonTransientConnectionException | SQLState ==08 のすべてのエラー |
SQLRecoverableException | エラーがありますが、アプリケーションの介入で修正できます |
SQLSyntaxErrorException | クエリ構文のエラー |
SQLTimeoutException | リクエストに時間がかかりすぎました |
SQLTransactionRollbackException | トランザクションのロールバック中にエラーが発生しました |
SQL警告 | DBMSが発行する警告 |
エラー例
サーバー アプリケーションの段階でエラーが発生した場合、通常はログに記録するだけで、より詳細に対処できます。ただし、プログラマのコンピュータでアプリケーションを実行中に問題が発生した場合は、その理由を注意深く調査する必要があります。
データベースを操作する場合、エラーには 2 つの大きなクラスがあります。
- リクエストテキストエラー
- ResultSet の操作中にエラーが発生しました
リクエスト テキストのエラーは非常に頻繁に発生する可能性があります。クエリは非常に長くなり、複数のテーブル (JOIN で結合) とサブクエリ (SUBSELECT) が含まれる場合があります。このようなリクエストのエラーを見つけるのは簡単ではありません。さらに、リクエストはパーツから結合されることが多く、そこにデータが追加されます。
注意すべき最初のエラーはSQLSyntaxErrorExceptionです。このようなエラーは通常、リクエスト本文にタイプミスがあることを意味します。
私たちのお気に入りの例を見てみましょう。
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
int count = results.getInt(1);
そして、リクエスト本文のアスタリスクを「誤って」削除してしまいます。
ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
int count = results.getInt(1);
次に、例外が発生します。
Exception in thread "main" java.sql.SQLSyntaxErrorException:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM task' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
SQL サーバーは、FROM の前に構文エラーがあったことを通知します。
ご要望をしっかりと拝見し、考えさせていただきます。何も思い浮かばず、これが頻繁に起こる場合は、誰かに何が問題なのかを尋ねる必要があります。
もう 1 つのよくある間違いは、リクエストの結果である ResultSet の誤った処理です。データを読み取る前に、ResultSet オブジェクトの「現在の行」が最初の行の前にあることを忘れていたとすると、次のコードが得られます。
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
// results.next();
int count = results.getInt(1);
次のエラーが表示されます。
2012 12:55:48 AM jButton5ActionPerformed
SEVERE: null
java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)
エラーを注意深く見て考えます。次に、Google でいくつかの例を見つけ、解決策を理解しようとします。
GO TO FULL VERSION