【问题标题】:having trouble display the name from my database无法从我的数据库中显示名称
【发布时间】:2020-04-11 02:25:12
【问题描述】:

我想在另一个JFrame中用他的ID登录后打印用户名

我遵循了这个方法,但它不起作用

//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 ");

【问题讨论】:

  • 什么是getuserName()? SQL函数还是JAVA函数?
  • java函数,第一类

标签: java sql sql-server swing swingworker


【解决方案1】:

从您的错误消息中可以清楚地看出,您的查询返回的结果集包含 0 行和 1 列。我假设您想将列 m_pass 与 JAVA 函数 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
  1. 在使用记录之前,您应该始终检查结果集中是否存在记录。你可以这样做
if (rs.next()) {
   // record found 
}
else {
  // record not found
}
  1. 尝试使用 SQL Sever Management Studio 或任何等效的 IDE 直接在您的数据库上执行相同的查询,看看它是否返回任何行。

阅读有关PreparedStatement 和JDBC ResultSet 的更多信息。 希望对您有所帮助!

【讨论】:

  • 谢谢你我试试这个,我发现错误,String方法中的错误,当我打印它时,值是= null
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 2020-11-26
  • 2014-06-10
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2019-03-19
  • 1970-01-01
相关资源
最近更新 更多