我有一个登录页面,并且建立了与我的数据库的连接并且在数据库中可见1条记录时正常工作但是当有2个条目(2个管理员用户)时,只有最后一个条目适用于登录而不是原来并不明白为什么!下面显示了我创建的整个代码,所以如果有人能给我一些关于这个问题的见解,我将不胜感激,谢谢!
package securitySystem;
import java.awt.*;
import javax.swing.*;
import java.sql.*;
import java.awt.event.*;
public class loginPage extends JFrame {
public static void main (String args[]){
loginPage gui= new loginPage ();
gui.setSize (400, 400);
gui.setLocationRelativeTo(null);
gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.setVisible(true);
gui.setTitle("Login Page");
}
JLabel lblUserName= new JLabel("UserName:");
JTextField txtUserName= new JTextField(15);
JLabel lblPassword= new JLabel("Password:");
JTextField txtPassword= new JTextField(15);
JButton btnForgotten= new JButton("Forgotten Login");
JButton btnLogin= new JButton("Login");
public loginPage (){
setLayout (null);
//JLabel lblUserName= new JLabel("UserName:");
lblUserName.setBounds(100,100,110,30);
add(lblUserName);
//JTextField txtUserName= new JTextField(15);
txtUserName.setBounds(170,100,110,30);
add(txtUserName);
//JLabel lblPassword= new JLabel("Password:");
lblPassword.setBounds(100,150,110,30);
add(lblPassword);
//JTextField txtPassword= new JTextField(15);
txtPassword.setBounds(170,150,110,30);
add(txtPassword);
//JButton btnLogin= new JButton("Login");
btnLogin.setBounds(100,300, 70, 30);
add(btnLogin);
actionlogin();
//JButton btnForgotten= new JButton("Forgotten Login");
btnForgotten.setBounds(175,300, 130, 30);
add(btnForgotten);
}
public void actionlogin()
{
btnLogin.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
String username = txtUserName.getText();
String password = txtPassword.getText();
String databaseUsername = "";
String databasePassword = "";
String dataSourceName = "securitySystem";
String dbUrl = "jdbc:odbc:" + dataSourceName;
try{
//Type of connection driver used
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//Connection variable or object param: dbPath, userName, password
Connection con = DriverManager.getConnection(dbUrl, "", "");
Statement statement = con.createStatement();
ResultSet rs = statement.executeQuery("select username, password from employee");
while (rs.next()) {
databaseUsername = rs.getString("username"); //resultSet.getString("username");
databasePassword = rs.getString("password");
}
statement.close();
con.close();
}catch (Exception e) {
try {
throw e;
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
//Compare the user entered info to the database info
if(username.equals(databaseUsername) && password.equals(databasePassword))
{
adminMenu gui =new adminMenu();
gui.setSize (400, 400);
gui.setLocationRelativeTo(null);
gui.setVisible(true);
dispose();
}
else
{
JOptionPane.showMessageDialog(null,"Wrong Password / Username");
txtUserName.setText("");
txtPassword.setText("");
txtUserName.requestFocus();
}
}
});
}
}
答案 0 :(得分:0)
这是因为
while (rs.next()) {
databaseUsername = rs.getString("username"); //resultSet.getString("username");
databasePassword = rs.getString("password");
}
对于第一行rs.next()
,返回true
databaseUsername
和databasePassword
获取第一行记录。现在第二行rs.next()再次返回true,因此{{ 1}}和databaseUsername
得到第二条记录,现在rs.next()返回false,所以控制来自循环,最后databasePassword
和databaseUsername
有最后一个数据行
如果用户名与databaseusername
匹配,您正在尝试此部分databasePassword
试试这种方式
adminMenu gui =new adminMenu();
gui.setSize (400, 400);
gui.setLocationRelativeTo(null);
gui.setVisible(true);
dispose();
答案 1 :(得分:0)
看看你的代码:
while (rs.next()) {
databaseUsername = rs.getString("username"); //resultSet.getString("username");
databasePassword = rs.getString("password");
}
如果有多行会发生什么?循环将多次运行,每次都会覆盖databaseUsername
和databasePassword
中的值。完成后,它将包含上次循环运行的值。
(另外,将纯文本密码存储在数据库中是一个非常糟糕的主意。)
答案 2 :(得分:0)
循环记录然后覆盖相同的字符串。登录应该是唯一的,所以你应该在if语句中检查它。