3

データベースの割り当てに取り組んでいますが、問題が発生しました。一度に 3 行を出力する必要があり、3 行の倍数ごとに停止し、続行するか中断するかをユーザーに促します。

これは、Oracle データベースで Java JDBC を使用しています。

if (rset.next()){
    // At this point, there are reviews to show                                                                                                          
    int rinc = 0;
    String seenextreviews = "y";
    System.out.println("Rating - Text - Reviewer - RDate");
    while(rset.next()){
        // Iterate through the result set                                                                                                                
        System.out.println("Increment: " + rinc);
        if(rinc % 3 == 0) {
            // Displayed 3 reviews                                                                                                                       
            seenextreviews = "maybe";
            while(!seenextreviews.equals("y") && !seenextreviews.equals("n")){
                seenextreviews = console.readLine("See next reviews (y/n)? ");
                if (!seenextreviews.equals("y") && !seenextreviews.equals("n")){
                    System.out.println("Invalid input '" + seenextreviews + "'");
                }
            }
            if (seenextreviews.equals("n")) {
                System.out.println("Breaking...");
                break;
            } else {
                System.out.println("Continue...");
            }
        }
        System.out.println(rset.getInt("rating") + " - " + 
            rset.getString("text") + " - " + 
            rset.getString("reviewer") + " - " + 
            rset.getString("rdate"));
        rinc = rinc + 1;
    }
}

指定されたコードでは、「if (rset.next())」内のすべての「System.out.println(values)」のみSystem.out.println("Invalid input '" + seenextreviews + "'");System.out.println(rset.getInt("rating")...);印刷され、他のすべては印刷されません。

ただし、 console.readLine("text") は、ユーザー入力を求める前にテキストを出力します。

print ステートメントが印刷されないのはなぜですか? クエリを変更して一度に 3 行を選択し、複数のクエリを呼び出す唯一の方法はありますか?

4

2 に答える 2

2

指定されたコードについて、「if (rset.next())」内のすべての「System.out.println(values)」のみ

からResultSet#next

カーソルを現在の位置から 1 行前方に移動します。

if (rset.next())したがって、クエリが単一の行を返し、条件でそれを読み取るように見えますwhile(rset.next()). while-loop.

考えられる解決策: フラグを使用してタイトルを出力します。

int rinc = 0;
String seenextreviews = "y";
while(rset.next()) {
    //this serves as flag
    if (rinc == 0) {
        System.out.println("Rating - Text - Reviewer - RDate");
    }
    //rest of your code logic...
}
于 2013-03-02T19:38:13.630 に答える
1

次のように進めることができます。

int rinc = 0;
boolean firstTime = true;
String seenextreviews = "y";

while (rs.next())
{
    if(firstTime)
    {
        System.out.println("Rating - Text - Reviewer - RDate");
        firstTime = false;
    }
    System.out.println(rset.getInt("rating") + " - " + 
            rset.getString("text") + " - " + 
            rset.getString("reviewer") + " - " + 
            rset.getString("rdate"));
    rinc += 1;

    if (rinc == 3)
    {
        boolean flag = false;
        while (true)
        {
            String seenextreviews = console.readLine("See next reviews (y/n)? ");
            if ("N".equalsIgnoreCase(seenextreviews.trim()))
            {
                flag = true;
                break;
            }
            else if ("Y".equalsIgnoreCase(seenextreviews.trim()))
            {
                rinc = 0;
                break;
            }
            else
            {
                System.out.println("Invalid input . Try again");
                continue;
            }
        }
        if (flag)
        {
            break;
        }
    }
}
于 2013-03-03T14:00:34.340 に答える