2

私のアプリは、あるプラットフォームでは MySQL を使用し、別のプラットフォームでは SQLite を使用しているため、次のようなクエリを使用する場合など、違いがありますDELETE FROM USERS

  • MySQLでは、が返されますPreparedStatement.getResultSet()null
  • SQLiteではPreparedStatement.getResultSet()がスローされjava.sql.SQLException: no ResultSet availableます。

これは、SQLite 実装のバグである場合とそうでない場合があります (返されるはずだと思いますnull) が、どうにかしてこれに対処する必要があります。

を使用できtry { ... } catch (SQLException e) { ... }、例外メッセージが の場合は"no ResultSet available"、手動で null を返すだけです。ただし、これは正しい方法とは思えません。

どの JDBC ドライバーが使用されているかをチェックし、それに応じて対応する if を設定することもできますが、これも問題の良い解決策とは思えません。

私が本当に欲しいのは、実行されたステートメントからSQL コマンド (など) を取得するためのOR.hasResultSet()を返すようなメソッドです。ただし、SQL API ではどちらも見つかりません。boolean SELECT, UPDATE, INSERT

4

2 に答える 2

6

不明な量の結果を返すクエリを実行する場合は、 を使用する必要がありますexecute()。このメソッドは、boolean結果のタイプを示す を返します。

  • true: 結果はResultSet
  • false: 結果は更新回数です

結果が の場合はtrueを使用getResultSet()して を取得しResultSet、それ以外の場合getUpdateCount()は更新回数を取得します。更新回数が-1である場合、これ以上結果がないことを意味します。更新カウントは-1、現在の結果がResultSet. getResultSet()結果がそれ以上ない場合、または結果が更新カウントの場合は null を返す必要があることも知っておくとよいので、例外をスローする SQL Lite の動作は間違っているようです。

より多くの結果を取得したい場合は、 (またはパラメーターgetMoreResults()を受け入れる兄弟) を呼び出します。intこのメソッドのboolean戻り値は の戻り値と同じ意味を持っているexecute()ので、これfalse以上結果がないわけではありません!

getMoreResults()がfalse getUpdateCount()返し-1、(Javadoc にも記載されているように)を返す場合にのみ、それ以上の結果はありません。

本質的にこれは、すべての結果を正しく処理したい場合、次のようなことをする必要があることを意味します:

PreparedStatement pstmt = connection.prepareStatement(...);
// ...
boolean result = pstmt.execute();
while(true)
    if (result) {
        ResultSet rs = pstmt.getResultSet();
        // Do something with resultset ...
    } else {
        int updateCount = pstmt.getUpdateCount();
        if (updateCount == -1) {
            // no more results
            break;
        }
        // Do something with update count ...
    }
    result = pstmt.getMoreResults();
}
于 2013-01-19T09:59:04.400 に答える
2

問題は、無効なメソッドを使用して削除操作を実行することです。使用する代わりに、を使用getResultSetする必要がありますStatement#execute(String)

IMHO SQLite実装の例外は、MySQLではnullよりも有効です。deleteセットを返すのではなく、削除された行のスカラー値を返します。

于 2013-01-08T11:36:58.110 に答える