2013-03-14 123 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