JDBC が空の結果セットを返す 質問する

JDBC が空の結果セットを返す 質問する

非常に単純なデータベース接続に JDBC を使用しています。

接続/ステートメントを作成し、クエリを実行しました。デバッガーでステートメントのクエリ オブジェクトをチェックして、適切なクエリが送信されていることを確認します。次に、データベースでクエリ (デバッガーから直接コピー) を再確認して、データが返されることを確認します。ただし、返された結果セットは、.next() で false を返します。

私が見逃しているよくある落とし穴はありますか?

public List<InterestGroup> getGroups() {
    myDB.sendQuery("select distinct group_name From group_members where
            username='" + this.username + "'");
    ResultSet results = myDB.getResults();
    List<InterestGroup> returnList = new ArrayList<InterestGroup>();
    try {
        while (results.next()) {
            returnList.add(new InterestGroup(results.getString("group_name"), myDB));
        } 
        return returnList;
    } catch (SQLException e) {
        e.printStackTrace();
        return null;
    }

}

そして、myDB クラス (接続/ステートメント コードを任意のプロジェクトにドロップできるシンプルなラッパー)

public void sendQuery(String query){
    this.query = query;
    try {
        if(statement == null){
            statement = connection.createStatement();
        }
        results = statement.executeQuery(query);
    } catch (SQLException e) {
        System.out.println(query);
        currentError = e;
        results = null;
        printError(e, "querying");
    }

}

public ResultSet getResults(){
    return results;
}

編集: 提案に基づいてコードをほぼ改訂しましたが、まだ同じ問題があります。以下は、同じ問題のあるコードの簡略化された部分です。

private boolean attemptLogin(String uName, String pWord) {

    ResultSet results;
    try{
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        connection =DriverManager.getConnection(connectionString,user,password);
        PreparedStatement statement = connection.prepareStatement("select username from users where username='testuser'");
        results = statement.executeQuery();
        if(results != null && results.next()){
            System.out.println("found a result");
            statement.close();
            return true;
        }
        System.out.println("did not find a result");
        statement.close();
        return false;
    }catch(SQLException e){
        e.printStackTrace();
        return false;
    }

}

また、エラーの原因を排除するために、クエリをハードコードしました。以前と同じ問題です (これはすべてのクエリで発生します)。デバッガーにはインスタンス化されるすべてのオブジェクトが表示され、スタック トレースは印刷されません。さらに、同じコード (および前にリストしたより複雑なコード) を別のプロジェクトで使用できます。

ベストアンサー1

分かりました... 愚かな Oracle は、私が同時に接続していた数 (全部で 2 つ、1 つはコンソール用、もう 1 つは Java 用) を気に入らなかったようです。残念ながら、サーバーは私の管理下にないため、自分で対処するしかありません。Oracle ならもっと良い応答を返すだろうと思うでしょう。しかし、空の結果セットが返されただけです。

ご回答ありがとうございます

編集この質問/回答がされて以来、根本的な原因は、使用されているコミット/トランザクション設定に関連している可能性が高いと指摘する人が多数います。追加のヒントや考えられる解決策については、他の回答を必ず参照してください。

おすすめ記事