【问题标题】:Inexplicable error in Java using Derby databases使用 Derby 数据库的 Java 出现莫名其妙的错误
【发布时间】:2013-07-13 02:27:59
【问题描述】:

我有应该查询 Derby 数据库的代码,但没有。更糟糕的是,它应该在不同的行打印错误消息,但甚至无法做到这一点。这是我的代码的 sn-p(我遇到问题的地方):

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

【问题讨论】:

  • OK ... 那么它实际输出的是什么?
  • 我知道我应该只依赖 Java 默认提供的面向对象的数据库。
  • 迈克——如果你需要帮助,你需要回答我的问题。否则,我们只是在这里浪费时间。 StackExchange 不是发布有关 Java 的投诉的合适场所...
  • (并且Java默认不提供任何数据库。它们都是3rd-party产品......关于Java SE,EE,ME......)
  • 是的,确实如此。它提供对象序列化,将对象序列化为字节形式以存储在文件(数据库)中。

标签: java derby


【解决方案1】:

您收到的错误消息是由于查询与数据库中的任何行都不匹配。他们的意思是:

  • 您的查询有误,或者
  • 插入/更新数据的程序/进程错误,或者
  • 您插入的数据有误。

更具体地说:

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

只有当BikeTripRecordTripNumber 等于所有行程记录的计数时,该查询才会返回一些内容。大概您正在尝试获取最后/最新的记录。如果是这样,那么该查询充其量是“脆弱的”。如果行程记录被删除或行程编号序列中存在“漏洞”,则查询可能会为您提供错误的记录或根本没有记录。

    SELECT * FROM BikeTripAnalysis

如果这个没有结果,那么表是空的。


简而言之,您的问题似乎是查询和应用程序设计的问题,而不是 Derby 或 Java。

我建议您查看数据库中实际获得的数据,并尝试使用 Derby 的查询工具执行这些查询。 (我假设它有一个......)

【讨论】:

  • 我没有插入任何数据(只是检索它!),我已经在 w3schools.org 上测试了查询(它在那里工作)。
  • 我不明白为什么我的错误消息没有按照我输入的代码显示,或者为什么 MessageDialog 根本没有显示...
  • 好吧,如果你看一下你输入的代码,很明显只有当第二个查询产生一些结果时才会显示对话框。看看if 语句的嵌套!!
  • 迈克——你需要改变对这个的态度。对程序没有按照您的意愿行事而生气/​​沮丧/怨恨无助于解决问题。解决它的方法是仔细和深思熟虑地检查你写的东西,找出为什么它是错误的,然后修复它。 (否认它是错误的......没有生产力。)
【解决方案2】:

这是查询。如果我会说类似 SELECT count(TripNumber) FROM BikeTripRecords 之类的内容,我可以得到 TripNumber,然后我应该说 SELECT AverageSpeed FROM BikeTripRecords WHERE TripNumber = (SELECT max(TripNumber) FROM BikeTripRecords) 用于 lastTripSpeed。我应该从代码中休息一下,回来,然后就很明显了。哦!

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 2019-02-04
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多