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

И какова ошибка? –

+0

Какую ошибку вы получаете? –

+0

Когда вы используете инструкции try catch, обычно это помогает просто распечатать трассировку стека, а не просто давать неопределенный вывод о природе исключения. – christopher

ответ

0

Попытайтесь изолировать функциональность базы данных от вашего пользовательского интерфейса. Просто напишите простой метод для запуска вставки, как и ваш метод слушателя, и посмотрите, можете ли вы заставить его работать. Вы почти делаете это сейчас, так как код, который вы опубликовали, фактически не извлекает данные из таблицы. Похоже, он просто запускает тестовое обновление. Тем не менее, я рекомендую вам создать класс DAO и поместить весь ваш код SQL вместо того, чтобы смешивать его с вашим кодом пользовательского интерфейса.

Сообщения об ошибках SQL не всегда являются полезными, но иногда они и есть. Вы игнорируете исключение в своем коде.

В частности, я хотел бы заменить блок поймать в коде с этим:

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

0

Попробуйте установить Classpath в папку, содержащую драйвер MYSQL JDBC и повторно запустить приложение

0

Если I'm не ошибаюсь, то заявление вы используете неправильно:

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

Вам не нужны имена столбцов, которые вы хотите связать со значениями.

Eddited: ВЫШЕ ложно, как ваше заявление и мое правильно.

Кроме того, если вы используете и INSERT заявление, вы можете просто (вам не придется создать заявление):

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

Так на так далее.

Если это не поможет, есть также (что случилось со мной много раз), что ваш MySQL-сервер может быть отключен (не работает). Убедитесь, что он работает первым.

Если ничего не работает, можете ли вы хотя бы попытаться дать нам ошибку, которую вы получаете?

+2

ни ваше заявление «INSERT INTO tableName ....», и его утверждение не так, вы можете указать имена столбцов или нет. – Azad

Смежные вопросы