2013-03-14 119 views
0

我想從一個JTable寫入數據到數據庫,但目前無法使用。 我總是得到一個mysql錯誤!有人可以告訴我什麼是錯的?準備語句數據庫

public class Fussball extends JFrame { 

    private JButton save = new JButton(); 
    private JTable jTable1 = new JTable(9, 4); 
    private DefaultTableModel jTable1Model = (DefaultTableModel) jTable1.getModel(); 
    private JScrollPane jTable1ScrollPane = new JScrollPane(jTable1); 

    public Fussball(String title) { 
     super(title); 
     setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
     int frameWidth = 563; 
     int frameHeight = 482; 
     setSize(frameWidth, frameHeight); 
     Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); 
     int x = (d.width - getSize().width)/2; 
     int y = (d.height - getSize().height)/2; 
     setLocation(x, y); 
     Container cp = getContentPane(); 
     cp.setLayout(null); 
     // Anfang Komponenten 
     save.setBounds(200, 304, 201, 65); 
     save.setText("speichern"); 
     save.setMargin(new Insets(2, 2, 2, 2)); 
     save.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent evt) { 
       save_ActionPerformed(evt); 
      } 
     }); 
     cp.add(save); 
     jTable1ScrollPane.setBounds(64, 48, 465, 225); 
     jTable1.getColumnModel().getColumn(0).setHeaderValue("Spiel ID"); 
     jTable1.getColumnModel().getColumn(1).setHeaderValue("Verein 1"); 
     jTable1.getColumnModel().getColumn(2).setHeaderValue("Verein 2"); 
     jTable1.getColumnModel().getColumn(3).setHeaderValue("Ergebnis"); 
     cp.add(jTable1ScrollPane); 
     // Ende Komponenten 
     setResizable(false); 
     setVisible(true); 
    } 

    public void save_ActionPerformed(ActionEvent evt) { 
     try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      Connection dbConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/fussball", "root", ""); 
      Statement statement = dbConn.createStatement(); 
      String insertQuery = "INSERT INTO Spiel VALUES (?,?,?,?)"; 
      PreparedStatement ps = dbConn.prepareStatement(insertQuery); 
      ps.setString(1, "idSpiel"); 
      ps.setString(2, "Vereinone"); 
      ps.setString(3, "Vereintwo"); 
      ps.setString(4, "Ergebnis"); 
      ps.executeUpdate(); 
      //Vector vector = new Vector(); 
      statement.close(); 
      dbConn.close(); 
     } catch (InstantiationException e) { 
      System.err.println("Error in Instantiation!"); 
     } catch (ClassNotFoundException e) { 
      System.err.println("Class not found!"); 
     } catch (IllegalAccessException e) { 
      System.err.println("Access denied!"); 
     } catch (SQLException e) { 
      System.err.println("SQL Error!"); 
     } 

    } 

    public static void main(String[] args) { 
     new Fussball("fussball"); 
    } 
} 
+7

什麼是錯誤? – 2013-03-14 17:25:07

+0

你會得到什麼錯誤? – 2013-03-14 17:25:07

+0

當您使用try catch語句時,通常只會打印堆棧跟蹤信息,而不僅僅是提供有關異常性質的模糊輸出。 – christopher 2013-03-14 17:28:52

回答

0

嘗試將數據庫功能從您的UI代碼中分離出來。只需編寫一個簡單的方法來像運行監聽器方法一樣運行插入,並查看是否可以使其工作。你現在幾乎這樣做了,因爲你發佈的代碼實際上並沒有從表格中提取數據。它看起來只是運行測試更新。不過,我建議您創建一個DAO類,並將所有SQL代碼放在那裏,而不是混入UI代碼中。

來自SQL的錯誤消息並不總是有幫助,但有時它們是。您在代碼中忽略了異常。

特別是,我將與此替換catch塊在代碼:

catch (SQLException e) { 
     System.err.println("SQL Error:" + e.toString()); 
} 

另外請注意,你不使用你的Statement statement = dbConn.createStatement();這樣你就可以直接刪除該行。

在你的DAO類中,你可以創建一個像這樣的測試方法來幫助我們隔離和解決這個問題。顯示異常消息而不是僅僅捕捉它們並打印自己的消息很重要。

public void testDBInsert() { 
    try { 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     Connection dbConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/fussball", "root", ""); 
     String insertQuery = "INSERT INTO Spiel VALUES (?,?,?,?)"; 
     PreparedStatement ps = dbConn.prepareStatement(insertQuery); 
     ps.setInt(1, 128); //should be an integer? 
     ps.setString(2, "Vereinone"); 
     ps.setString(3, "Vereintwo"); 
     ps.setString(4, "Ergebnis"); 
     ps.executeUpdate(); 
     ps.close(); 
     dbConn.close(); 
    } catch (Exception e) { 
     System.err.println("Error in SQL Test: " + e.toString()); 
    } 
} 
+1

這不是對這個問題的回答。 – christopher 2013-03-14 17:34:25

0

嘗試設置Classpath含有MySQL JDBC驅動程序和文件夾重新運行應用程序

0

如果我可不是誤,您正在使用的說法是錯誤的:

private final String INSERT_QUERY= 
"INSERT INTO tableName (col_name,col_name2, col_name3) VALUES(?, ?, ?);"; 

您錯過了要與值關聯的列的名稱。

編輯︰上面是錯誤的,你的聲明和我的都是正確的。

另外,如果你使用的是和INSERT語句中,你可以做(​​你沒有必要創建語句):

PreparedStatement p = dbConn.prepareStatement(INSERT_QUERY); 
p.setString(...); 

如此類推。

如果沒有幫助,還有(這在我身上發生過很多次)事實上你的MySQL服務器可能被關閉(不運行)。檢查它是否先運行。

如果沒有任何工作,你能至少嘗試給我們你得到的錯誤?

+2

既沒有你的語句'INSERT INTO tableName ....',他的語句也沒有錯,你可以指定列名或不是可選的。 – Azad 2013-03-14 17:48:33