2016-05-11 67 views
0

我想創建一個表,插入到表中並使用Derby打印表格的內容(如下所示)。在eclipse項目中實現嵌入式Derby數據庫的問題?

TestProject類

package com.user.DerbyTest; 

public class TestProject { 

    public static void main(String[] args) { 
     DBConnection db = new DBConnection(); 
     db.createTable(); 
     db.insertIntoTable("todd", 23, 'M'); 
     db.insertIntoTable("wayne", 54, 'M'); 
     db.printAll(); 
    } 
} 

DBConnection的類

package com.user.DerbyTest; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 


public class DBConnection { 
    private static final String DRIVER = "org.apache.derby.jdbc.*"; 
    private static final String JDBC_URL = "jdbc:derby:derbytest;create=true"; 

    Connection conn; 

    public DBConnection(){ 
     try { 
      this.conn = DriverManager.getConnection(JDBC_URL); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     if (this.conn != null){ 
      System.out.println("Connected to database."); 
     } 
    } 

    public void createTable(){ 
     try { 
      conn.createStatement().execute("Create TABLE MyDerbytable(Name varchar(50), Age INT, Gender char(1))"); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


    public void insertIntoTable(String name, int age, char gender){ 
     try { 
      conn.createStatement().execute("INSERT INTO MyDerbytable Values ("+name+","+age+","+gender+")"); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void printAll(){ 
     try { 
      Statement statement = this.conn.createStatement(); 
      ResultSet res = statement.executeQuery("Select * FROM MyDerbytable"); 

      while(res.next()){ 
       System.out.println(res.getString("Name") + res.getString("Age") + res.getString("Gender")); 
      } 


     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

試圖運行這個時,我收到錯誤的整體plethra:

enter image description here

有什麼建議嗎?

編輯:更改爲DROP錯誤:

enter image description here

回答

1

你的表已經存在。嘗試DROP TABLE myderbytable;

+0

謝謝!但仍然出現錯誤..請參閱我的編輯 – vkapustin

+0

顯示完整的錯誤消息。 – Tassu

+0

@vkapustin你可以顯示你的drop table語句嗎? – Tassu

0

你的第一個INSERT語句最終會被:

INSERT INTO MyDerbytable Values (todd,23,M) 

所以作爲給你,你看到的錯誤,以列名的引用對待你周圍有toddM值沒有引號。你必須用這樣的字面值用單引號:

INSERT INTO MyDerbytable Values ('todd',23,'M') 

所以你插入的代碼可能是:

"INSERT INTO MyDerbytable Values ('"+name+"','"+age+"','"+gender+"')" 

(注意額外「字符)。

連接字符串就像你正在做的離開你開放SQL Injection Attacks。如果您的任何輸入包含引號字符,它也會給您帶來問題。瞭解如何使用PreparedStatement

+0

雖然我使用引號?當我把「託德」改成「託德」時,我得到一個「無效的字符常量」錯誤。我更擔心只是讓這些裸骨頭工作比其他任何東西 – vkapustin

+0

不,你不使用報價。不要將Java字符串的引用與Derby需要的引號混淆。添加了示例代碼來回答。 –

相關問題