не отражает изменения в базе данных, что-то не так с кодом? - PullRequest
0 голосов
/ 04 апреля 2019

Я сделал графический интерфейс для ввода данных в мою базу данных по нажатию кнопки, но это не отражает изменения в базе данных.Кто-нибудь может решить проблему?

public class ExpenseManager implements ActionListener {
    JFrame frame ;
    JTextField t1 = new JTextField("");
    JTextField t2 = new JTextField("");
    void go(){
        frame = new JFrame("Daily Expenses");
        JButton b = new JButton("SUBMIT");
        frame.add(t1);
        t1.setBounds(50,50,200,30);
        frame.add(t2);
        t2.setBounds(50,100,200,30);
        frame.add(b);
        b.setBounds(50,150,200,30);
        b.addActionListener(this);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.getContentPane().setBackground(Color.darkGray);
        frame.setSize(300,300);
        frame.setVisible(true);
    }
    public void actionPerformed(ActionEvent e){
        try{
            Class.forName("com.mysql.jdbc.Driver");
            Connection con= DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/try","root","root");
            Statement stmt=con.createStatement();
            String x = t1.getText();
            int x1 = Integer.parseInt(x);
            String y = t2.getText();
            ResultSet rs=stmt.executeQuery("INSERT INTO data (amt, dis) VALUES (x1,y); ");
            con.close();
        }catch(Exception eX){ System.out.println(e);}
    }
}```

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

INSERT это не запрос в Java, это обновление.Таким образом, изменение stmt.executeQuery на stmt.executeUpdate должно помочь.Это также не создаст ResultSet, который вам не нужен в этом случае.

Также, быстрое замечание: если вы программируете какие-либо запросы, подобные этой, вы сталкиваетесь с вероятностью утечек памяти, попробуйте использоватьоператоры try-catch-finally для запросов к базе данных и всегда закрывайте соединение, набор результатов и оператор.Вам также необходимо выполнить вызов Class.forName ("com.mysql.jdbc.Driver") только один раз в начале вашей программы.

0 голосов
/ 04 апреля 2019

В вашем случае было бы лучше следовать рекомендациям, используя PrparedStatment вместо Statement, или, по крайней мере, исправить запрос на вставку, поскольку вы пытаетесь вставить буквенные значения x1,y, а не переменные x1 & y.правильная реализация PreparedStatement будет такой:

String sql = "INSERT INTO data (amt, dis) VALUES(?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, x1);
pstmt.setDouble(2, y);
pstmt.executeUpdate();

, если вы хотите продолжать использовать Statement, вам следует изменить тип запроса на executeUpdate вместо executeQuery, и вытакже следует добавить фактические значения ваших переменных, рабочий пример может быть:

Statement stmt=con.createStatement();
String x = t1.getText();
int x1 = Integer.parseInt(x);
String y = t2.getText();
String query = String.format("INSERT INTO data (amt, dis) VALUES (%d,%s)",x1,y);
stmt.executeUpdate(query);

Примечания:

  • Если ваше приложениепредполагается, что в базу данных будут поступать разные петиции, вы можете рассмотреть возможность создания независимого метода для инициализации вашего соединения с базой данных, чтобы вы могли вызывать его там, где вам это необходимо, рабочим примером может быть следующий:
private Connection connect() {
    // SQLite connection string
    String url = "jdbc:mysql://localhost:3306/try";
    Connection conn = null;
    try {
        conn = DriverManager.getConnection(url, "root", "root");
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    return conn;
}
  • Переменная ResultSet, которая генерируется после запроса, который не извлекает данные, даст вам Integer число затронутых строк.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...