2012-11-07 48 views
0

我正在Netbeans 7.2.1上構建帶有嵌入式數據庫的Java應用程序。現在,我可以通過下面的代碼建立與Derby數據庫的連接:Netbeans 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))"); 

它的工作原理。表被創建,如果我再次嘗試它給出表已存在的預期錯誤。但是,我在服務面板上查看應用程序嵌入式德比數據庫,而此「測試表」不在其中。

此外,如果我執行該表上的選擇,它不會給出架構錯誤,但在其他我在服務面板上手動創建的錯誤中繼續給出錯誤。

那麼,任何人都可以解釋一下是什麼區別?我創建的test_table在哪裏?這種創建模式與在德比創建表格的區別是什麼?爲什麼我會收到模式錯誤而不是其他錯誤?

對不起,有很多問題,但現在我很困惑。謝謝!

+0

是ADMIN_DATABASE你的數據庫名? – PermGenError

+0

有關您的錯誤的更多信息,請稍後再澄清.. [請參閱此處以瞭解更多信息](http://db.apache.org/derby/integrate/plugin_help/derby_app.html) – gks

+0

不,Admin_Database被推定爲登錄數據庫的用戶名。 – user1511579

回答

1

netbeans中的服務面板中的數據庫運行在不同的JVM中,並且是Derby的聯網實例。當您使用您使用的URL連接到數據庫時,您最終將在JVM中創建嵌入式數據庫,並且此數據庫將爲空。

要連接到服務面板數據庫,使用正確的連接URL,像jdbc:derby://localhost:1527/DATABASE_NAME(更多信息here

+0

對不起,後面的回覆Bill, 關於你說的,我想要的實際上是一個嵌入式數據庫,所以在未來這可能是一個獨立的應用程序。 但我有模式訪問我通過jdbc:derby:database; create = true在服務中創建的數據庫的問題。 而我仍然不明白它通過代碼創建的表格,因爲我張貼在上面,我根本看不到它。我承認我現在很困惑。 – user1511579

+0

@ user1511579服務面板對我使用嵌入式數據庫似乎有很大的幫助。我想可以這樣配置它,也許在你創建數據庫之後,你可以連接它到服務面板。問題是一次只有一個JVM可以訪問它。您的程序需要包含某種模式生成/演變,然後您需要控制嵌入式數據庫在文件系統上的位置。例如http://stackoverflow.com/questions/10666313/connecting-to-a-file-based-derby-database/10666543#10666543 – Bill

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變量。)

我希望這一切可以幫助你,讓我知道,如果你有任何問題。一定要讓我知道它是如何運作的,因爲我也想知道,以供我未來的參考。 (在個人項目上工作,你看。)祝你好運。

相關問題