-1

Derby データベースを照会するはずのコードがありますが、そうではありません。さらに悪いことに、エラーメッセージを別々の行に出力することになっていますが、それさえ失敗しています。これが私のコードのスニペットです(問題が発生している場所):

try
    {
        connection = DriverManager.getConnection(DATABASE_URL);
        //setting up the statement to handle our initial query
        statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
                ResultSet.CONCUR_READ_ONLY);
        resultSet = statement.executeQuery("SELECT TripNumber,AverageSpeed FROM " +
                "BikeTripRecords WHERE TripNumber=(SELECT count(TripNumber) FROM " +
                "BikeTripRecords)");
        //initializing maxShowableRecords depending on the number of BikeTrips already
        //recorded to the database
        if (!resultSet.next())
        {
            System.err.println("There was a problem processing your query.");
            System.out.println("This error occurred on line 86");
        }
        else
        {
            tripCount = resultSet.getInt(1);
            this.maxShowableRecords = (((x < tripCount) && (x > 1)) ? x : 
                tripCount);
            lastTripSpeed = resultSet.getDouble(2);

        }
        //getting information about their trip history (and their last trip)
        resultSet = statement.executeQuery("SELECT * FROM BikeTripAnalysis");
        System.out.println("This error occurred on line 98");
        if (!resultSet.next())
        {
            System.err.println("There was a problem processing your query.");
        }
        else
        {
            //storing the values in the view to variables so that we don't have to keep
            //querying the database
            minSpeed = resultSet.getDouble(1);
            maxSpeed = resultSet.getDouble(2);
            avgSpeed = resultSet.getDouble(3);
            resultSet.close();
            //forming the statement to display
            messageToDisplay = String.format("Out of the %d trips you have " +
                    "recorded, these are your stats:\n\nMinimum Speed == " +
                    "%f\nMaximum Speed == %f\nAverage Speed == %.2f\n\nYour Last " +
                    "Speed == %.2f", tripCount, minSpeed, maxSpeed, avgSpeed,
                    lastTripSpeed);
            if ((lastTripSpeed == minSpeed) && (tripCount > 1))
            {
                messageToDisplay += "Your last average speed was your worst. You " +
                        "can do better!!";
            }
            else 
            {
                if ((lastTripSpeed == maxSpeed) && (tripCount > 1))
                {
                    messageToDisplay += "\n\nYou have set a new speed record!! " +
                            "Keep on keeping on!!";
                }
                else
                {
                    if (lastTripSpeed < avgSpeed)
                    {
                        messageToDisplay += "\n\nYou are below your average. Step" +
                                " it up!";
                    }
                    else
                    {
                        messageToDisplay += "\n\nYou are above your average. Keep." +
                                " It. Up!!";
                    }
                }
                //showing the user this message
                JOptionPane.showMessageDialog(this, messageToDisplay);
            }
        }
    }
    catch (SQLException exception)
    {
        exception.printStackTrace();
        System.exit(1);
    }

けがに侮辱を加えるのは、MessageDialog が想定されていないときに表示されているという事実です。

実際、次のようなものが得られます。

There was a problem processing your query.This error occurred on line 86

This error occurred on line 98
4

2 に答える 2

1

表示されるエラー メッセージは、クエリがデータベース内のどの行にも一致しないことが原因です。次のいずれかを意味します。

  • あなたのクエリが間違っている、または
  • データを挿入/更新しているプログラム/プロセスが間違っている、または
  • 挿入するデータが間違っています。

すなわち:

    SELECT TripNumber,AverageSpeed FROM " +
            "BikeTripRecords WHERE TripNumber=(SELECT count(TripNumber) FROM " +
            "BikeTripRecords)

そのクエリは、すべての旅行レコードの数と等しいBikeTripRecordがある場合にのみ何かを返します。TripNumberおそらく、最後の/最新のレコードを取得しようとしています。もしそうなら、そのクエリはせいぜい「壊れやすい」です。出張レコードが削除されている場合、または出張番号シーケンスに「穴」がある場合、クエリによって間違ったレコードが返されるか、レコードがまったく返されない可能性があります。

    SELECT * FROM BikeTripAnalysis

これで結果が得られない場合、テーブルは空です。


要するに、あなたの問題はクエリとアプリケーション設計の問題であり、Derby や Java の問題ではないようです。

データベースで実際に取得したデータを確認し、Derby のクエリ ツールを使用してそれらのクエリを実行してみることをお勧めします。(私はそれが1つあると仮定します...)

于 2013-07-13T02:43:37.123 に答える
0

それはクエリでした。SELECT count(TripNumber) FROM BikeTripRecords のように言えば、TripNumber を取得できたはずです。次に、lastTripSpeed に対して SELECT AverageSpeed FROM BikeTripRecords WHERE TripNumber = (SELECT max(TripNumber) FROM BikeTripRecords) と言うべきでした。私はコードから休憩を取って戻ってくるべきでした。ああ!

于 2013-07-13T03:12:48.457 に答える