0

我正在 Netbeans 7.2.1 上构建一个带有嵌入式数据库的 Java 应用程序。现在,我可以通过以下代码与 derby 数据库建立连接:

Connection con = DriverManager.getConnection(
                     "jdbc:derby:database;create=true",
                     uName,
                     uPass);

但是,我无法对数据库的表执行查询。经过一番研究,我尝试执行以下代码,但没有成功:

Statement stmt = con.createStatement();

ResultSet rs;
rs = stmt.executeQuery("SELECT descricao FROM fichas");

while (rs.next()) {
    String s = rs.getString("descricao"); 
    System.out.println(s);
}

我这里有两个问题。首先,根据我所做的搜索,我应该使用上面示例中的 Statement stmt,但 netbeans 给了我一个错误。为了能够执行跟随他的方法“stmt.executeQuery()”,我必须将语句定义为:

java.sql.Statement stmt = con.createStatement();

如果我不这样使用它,我就无法选择“executeQuery”方法。其次,即使使用它,查询也不会被执行。我在控制台上收到错误:

java.sql.SQLSyntaxErrorException:架构“ADMIN_DATABASE”不存在

任何提示我如何解决这个问题?谢谢!

新更新:

我正在运行一些测试,这里有一些新的结论。如果不是通过 netbeans 的服务面板创建表,我运行代码:

stmt.execute("create table test_table (name varchar(128))");

有用。该表已创建,如果我再试一次,它会给出该表已经存在的预期错误。但是,我查看了服务面板,在应用程序嵌入的 derby 数据库中,这个“测试表”与其他“测试表”并没有在一起。

除此之外,如果我在该表上执行选择,它不会给出模式错误,但在我在服务面板上手动创建的其他表中,它会继续给出错误。

那么,谁能解释一下有什么区别?test_table我创建的去哪里了?这种创建模式与在 derby 上创建表的模式有什么区别?为什么我会收到一个架构错误而不是其他架构错误?

对不起这么多问题,但现在我很困惑。谢谢!

4

2 回答 2

1

netbeans 服务面板中的数据库在不同的 JVM 中运行,并且是 Derby 的网络实例。当您使用您使用的 url 连接到数据库时jdbc:derby:database;create=true,您最终会在 JVM 中创建一个嵌入式数据库,该数据库将为空。

要连接到服务面板中的数据库,请使用正确的连接 URL,例如jdbc:derby://localhost:1527/DATABASE_NAME(更多信息在这里.

于 2012-11-07T12:55:07.693 回答
0

由于在我有 50 个代表之前它不会让我发表评论,因为原因,我将在这里发布我的回复,以及底部附近的一些实际示例代码,这些代码应该有助于为您指明正确的方向。

  1. 如果你想测试你创建表的能力,这是一个很好的做法,你可以事先打一个 DROP TABLE TABLE_NAME 语句,只是在你再次尝试创建它之前删除它。当尝试使用已经存在的 TABLE_NAME 创建表时,它不会替换它,您的语句只会失败。

  2. 除了指定数据库的名称之外,您可能还必须引用您的模式,尽管这不是确定的。

  3. 我建议使用 java 方法来分隔您的 SELECT、INSERT INTO、UPDATE、CREATE TABLE 等语句。不确定您是否已经这样做了,但是,嘿,只是想提供帮助。

  4. 最后,这是我在去年夏天参加的大学课程中用于类似项目的语法。希望您可以从中获得实现目标所需的适​​当语法。我也使用 Derby 数据库在 Netbeans 中完成了这一切。(见下文)

    //Variables for database connection below 
    final String rolodexDriver = "org.apache.derby.jdbc.ClientDriver";
        final String rolodexURL = "jdbc:derby://localhost:1527/rolodexDatabase";
        final String dbName = "rolodexDatabase"; //db is short for database
        final String tableName = "Rolodex_Table";
        final String user = "Joey";
        final String password = "dbpassword";  //db is again short for database
    

    下面是我用于通过方法建立与数据库的连接的代码。

    // Below is the method invoked to establish a connection to the database
    public void accessDatabase() throws ClassNotFoundException{
    try {
    
        Class.forName(rolodexDriver).newInstance();
        connection = DriverManager.getConnection(rolodexURL, user, password);
        statement = connection.createStatement();
    } catch (InstantiationException | IllegalAccessException | SQLException ex) {
        Logger.getLogger(rolodexBean.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    } // end of accessDatabase method
    

    下面是我用于 SELECT 语句的代码,请务必注意此处的语法。

      String sql = "SELECT \"Person_name\", \"Person_phone_number\" FROM \"Rolodex_Table\"";
    

    下面是我用来更新记录的代码。同样,请务必注意语法。您最好将表名、列名等放在 \ 中,因为它将它们与编译器头脑中的操作(即 SELECT、UPDATE 等)和修饰符(即 WHERE、LIKE 等)分开.

    String editSQL = ("UPDATE \"Rolodex_Table\" SET \"Person_name\"='" + nameEntry + 
    "', \"Person_phone_number\"='" + phoneNumberEntry 
    + "' WHERE \"Person_name\"='" + editNameEntry + "'" );
    

    (顺便说一句,以防万一你不知道,你可以像这样多行字符串以便于阅读,只要确保你只使用一个分号等。你也可以在字符串中使用你的 java 变量,如果你遵循我上面使用的语法。注意 phoneNumberEntry 和 editNameEntry 都是 java 变量。)

我希望这一切都对您有所帮助,如果您有任何问题,请告诉我。一定要让我知道它是如何工作的,因为我也想知道,以供我自己将来参考。(您会看到,从事个人业余项目。)祝您好运。

于 2016-07-05T11:41:44.813 回答