возникли проблемы с отображением имени из моей базы данных - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу напечатать имя пользователя после входа с его ID в другом JFrame

Я следовал этому методу, но он не работает

//this class to login
 public mClass() {
// Frame build :
        setSize(800, 600);
        setTitle(" page1  ");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        Toolkit toolkit = getToolkit();
        Dimension size = toolkit.getScreenSize();
        setLocation(size.width / 2 - getWidth() / 2,
                size.height / 3 - getHeight() / 3);
        //Panel & BackGround :
        JPanel panel = new JPanel();
        getContentPane().add(panel);
        panel.setLayout(null);
        panel.setBackground(Color.decode("#DFDDCE"));

        // text box
        JTextField user = new JTextField();
        user.setBounds(245, 300, 300, 40);
        user.setFont(newFonts);
        user.setForeground(Color.decode("#5195E1"));
        panel.add(user);
        // text for box :
        JLabel tx = new JLabel(" Enter your ID to login.");
        tx.setBounds(245, 30, size.width, size.height);
        panel.add(tx);
        //submit button :
        JButton login = new JButton(" login ");
        login.setBounds(245, 355, 300, 40);
        login.setBorder(new LineBorder(Color.decode("#5195E1")));
           login.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        try {
                            // Class.forName("com.mysql.jdbc.Driver");
                            String host = "jdbc:mysql://localhost:3306/mybase?serverTimezone=UTC";
                            String uName = "root"; String uPass = "dataroot";
                            Connection con = DriverManager.getConnection(host, uName, uPass);
                            String password=user.getText();
                            String sql = "SELECT * FROM mstable where m_pass=? ";
                            PreparedStatement pst = con.prepareStatement(sql);
                            pst.setString(1,password);
                            ResultSet rs = pst.executeQuery();
                            if(rs.next()) {
                                new welcomeMs();
                                dispose();
                            }
                            else { JOptionPane.showMessageDialog(null,"wrong id , Please try again ");
                                 } }
                        catch ( SQLException ex) { System.out.println(ex); }
                       } });
           panel.add(login);
        //back button :
        setVisible(true);

    }
    public String getuserName() {
        return this.user;
    }
}


Я хочу показать имя в этот класс

// i extend this class to the last Class
try {
            // Class.forName("com.mysql.jdbc.Driver");
            String host = "jdbc:mysql://localhost:3306/mybase?serverTimezone=UTC";
            String uName = "root";
            String uPass = "dataroot";
            Connection con = DriverManager.getConnection(host, uName, uPass);
            String sql = "SELECT m_name FROM mstable where m_pass = 'getuserName()' ";
            PreparedStatement pst = con.prepareStatement(sql);
            //pst.setString(1, getuserName());
            ResultSet rs = pst.executeQuery();
            rs.next();
                JLabel label = new JLabel();
                label.setText(rs.getString(1) + " welcome ");
                label.setBounds(402, -295, size.width, size.height);
                panel.add(label);
        } catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,ex);
        }
f.setVisible(true);

Когда я пытаюсь войти в систему, появляется это сообщение: "недопустимая операция с пустым набором результатов" или когда я удаляю // "Индекс параметра выходит за пределы диапазона (1> количество параметров, что 0). " Я думаю, что ошибка в

 pst.setString(1, getuserName());

// или

  label.setText(rs.getString(1) + " welcome ");

1 Ответ

0 голосов
/ 12 апреля 2020

Из вашего сообщения об ошибке ясно, что ваш запрос возвращает набор результатов, который содержит 0 строк и 1 столбец. Я предполагаю, что вы хотите сравнить столбец m_pass с возвращенным значением JAVA function getuserName() (или вы можете сравнить с паролем пользователя).

Вы можете попробовать следующее:

  1. Обновите код запроса так:
String sql = "SELECT m_name FROM mstable where m_pass = ?";
PreparedStatement pst = con.prepareStatement(sql);
pst.setString(1, getuserName()); //Or any string that you want to compare
Вы должны всегда проверять, существует ли запись в наборе результатов, прежде чем использовать ее. Вы можете сделать это с помощью
if (rs.next()) {
   // record found 
}
else {
  // record not found
}
Попробуйте выполнить тот же запрос к вашей базе данных напрямую, используя SQL Sever Management Studio или любую эквивалентную среду разработки, и посмотрите, возвращает ли она какие-либо строки.

Подробнее о PreparedStatement и JDB C ResultSet . Надеюсь, это поможет!

...