Как вставить данные в базу данных CRUD GUI java, включающую 2 таблицы с 1 каналом передачи данных с первичным ключом и внешним ключом?
Когда я пытаюсь вставить данные в таблицу студентов, которые включают в себя один из данных в другой таблице (пример: программа) справа, диалоговое окно отображает сообщение "пожалуйста, введите конкретные детали" после того, как я google, но не подходит с ним.
Что я уже пробовал:
Можете проверить только инструкцию вставки проблемы и объяснить мне ошибку, пожалуйста?
Пример для таблицы программ:
CREATE TABLE "PROGRAMME" ( "CODE" VARCHAR(3) not null primary key, "NAME" VARCHAR(80), "FACULTY" VARCHAR(5) ); INSERT INTO PROGRAMME VALUES ('IA', 'Information Systems Engineering', 'FASC'); INSERT INTO PROGRAMME VALUES ('IB', 'Business Information Systems', 'FASC'); Example for Student table: CREATE TABLE "STUDENT" ( "ID" VARCHAR(10) not null primary key, "IC" VARCHAR(14) unique, "NAME" VARCHAR(50), "LEVEL" CHAR(1), "PROGRAMMECODE" VARCHAR(3), "YR" INTEGER, foreign key ("PROGRAMMECODE") references "PROGRAMME"("CODE") );
Программа:
package ui; import control.MaintainProgrammeControl; import control.MaintainStudentControl; import java.awt.*; import java.awt.event.*; import java.sql.*; import javax.swing.*; import domain.Programme; import domain.Student; import java.util.logging.*; public class MaintainStudentFrame extends JFrame { private String host = "jdbc:derby://localhost:1527/collegedb"; private String user = "nbuser"; private String password = "nbuser"; private final String tableName = "Student"; private final String tableName2 = "Programme"; private Connection conn; private PreparedStatement stmt; private JTextField jtfID = new JTextField(); private JTextField jtfIC = new JTextField(); private JTextField jtfName = new JTextField(); private JTextField jtfLevel = new JTextField(); private JTextField jtfProgCode = new JTextField(); private JTextField jtfYear = new JTextField(); private JButton jbtAdd = new JButton("Create"); private MaintainStudentControl msControl; public MaintainStudentFrame() { msControl = new MaintainStudentControl(); JPanel jpCenter = new JPanel(new GridLayout(6, 2)); jpCenter.add(new JLabel("Student ID")); jpCenter.add(jtfID); jpCenter.add(new JLabel("Student IC")); jpCenter.add(jtfIC); jpCenter.add(new JLabel("Student Name")); jpCenter.add(jtfName); jpCenter.add(new JLabel("Level")); jpCenter.add(jtfLevel); jpCenter.add(new JLabel("Programme Code")); jpCenter.add(jtfProgCode); jpCenter.add(new JLabel("Year")); jpCenter.add(jtfYear); add(jpCenter); JPanel jpSouth = new JPanel(); jpSouth.add(jbtAdd); jpSouth.add(jbtRetrieve); jpSouth.add(jbtUpdate); jpSouth.add(jbtDelete); add(jpSouth, BorderLayout.SOUTH); jbtAdd.addActionListener(new AddListener()); createConnection(); } public Student selectRecord(String ID) { String queryStr = "SELECT * FROM " + tableName + " WHERE id = ?"; try(Connection conn = createConnection(); PreparedStatement stmt = conn.prepareStatement(queryStr);){ stmt.setString(1,ID); try(ResultSet rs = stmt.executeQuery()){ Programme prog = new Programme(); if(rs.next()){ prog.setCode(rs.getString(5)); return new Student(ID, rs.getString(2), rs.getString(3), rs.getString(4).charAt(0), prog, rs.getInt(6)); } } catch (SQLException ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE); } } catch (SQLException ex) { Logger.getLogger(MaintainStudentFrame.class.getName()).log(Level.SEVERE, null, ex); } return null; } public boolean insertRecord(String ID, String IC, String name, char level, Student student, int year){ String queryStr = "insert into " + tableName + " (id,ic,name,level,progCode,year) values (?,?,?,?,?,?)"; <--- Display please enter particular details message afte I enter the data many times try(Connection conn = createConnection(); PreparedStatement stmt = conn.prepareStatement(queryStr);){ stmt.setString(1,ID); stmt.setString(2,IC); stmt.setString(3,name); stmt.setString(4,String.format("%c", level)); stmt.setString(5,student.getProgramme().getCode()); stmt.setString(6,String.format("%d", year)); return stmt.executeUpdate() > 0; }catch(Exception ex){ ex.printStackTrace(); } return false; } private class AddListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e) { Student stud = selectRecord(jtfProgCode.getText()); if(insertRecord(jtfID.getText(), jtfIC.getText(), jtfName.getText(), jtfLevel.getText().charAt(0), stud, Integer.parseInt(jtfYear.getText()))){ JOptionPane.showMessageDialog(null, "YOUR NEW RECORD IS CREATED AND ADDED", "ADD RECORD", JOptionPane.INFORMATION_MESSAGE); } else{ JOptionPane.showMessageDialog(null, "PLEASE ENTER THE PARTICULAR DETAIL", "ADD RECORD", JOptionPane.INFORMATION_MESSAGE); } } } private Connection createConnection() { try { conn = DriverManager.getConnection(host, user, password); } catch (SQLException ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE); } return conn; } private void shutDown() { if (conn != null) try { conn.close(); } catch (SQLException ex) { JOptionPane.showMessageDialog(null, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE); } } public static void main(String[] args) { MaintainStudentFrame frm = new MaintainStudentFrame(); frm.setTitle("Student CRUD"); frm.setSize(600, 200); frm.setLocationRelativeTo(null); frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frm.setVisible(true); } }