Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java while循环多次返回错误消息_Java_Jdbc_Database Connection - Fatal编程技术网

Java while循环多次返回错误消息

Java while循环多次返回错误消息,java,jdbc,database-connection,Java,Jdbc,Database Connection,我有一个登录页面,当输入登录详细信息时,while循环访问数据库以验证输入,但如果我在数据库中有3条记录且输入不正确,则错误消息显示3次,如果输入正确,则错误消息显示两次。我知道为什么会发生这种情况(由于while循环),但我不知道如何抵消这种情况。代码如下: package securitySystem; import java.awt.*; import javax.swing.*; import java.sql.*; import java.awt.event.*; public c

我有一个登录页面,当输入登录详细信息时,while循环访问数据库以验证输入,但如果我在数据库中有3条记录且输入不正确,则错误消息显示3次,如果输入正确,则错误消息显示两次。我知道为什么会发生这种情况(由于while循环),但我不知道如何抵消这种情况。代码如下:

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())
                {
                    if(username.equals(rs.getString("username")) && password.equals(rs.getString("password")))
                    {
                        adminMenu gui =new adminMenu();
                        gui.setSize (400, 400);
                        gui.setLocationRelativeTo(null);
                        gui.setVisible(true);
                        dispose();
                    }
                    else
                    {
                        JOptionPane.showMessageDialog(null,"The username or password that you have entered are incorrect");
                        txtUserName.setText("");
                        txtPassword.setText("");
                        txtUserName.requestFocus();
                    }       
                }

                statement.close();
                con.close();
            }catch (Exception e) {
                try {
                    throw e;
                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }                       
        }
    });
}

}您需要添加一个
中断语句以在失败后退出循环

else
{
    JOptionPane.showMessageDialog(null,"The username or password that you have entered are incorrect");
    txtUserName.setText("");
    txtPassword.setText("");
    txtUserName.requestFocus();
    break; // <-- this is needed
} 

你应该用一个标志来解决这个问题,它比
中断
更干净

            boolean nomatches=true;
            while(rs.next())
            {
                if(username.equals(rs.getString("username")) && password.equals(rs.getString("password")))
                {
                    adminMenu gui =new adminMenu();
                    gui.setSize (400, 400);
                    gui.setLocationRelativeTo(null);
                    gui.setVisible(true);
                    dispose();
                    nomatches=false;
                }    
            }

            if(nomatches) {
                    JOptionPane.showMessageDialog(null,"The username or password that you have entered are incorrect");
                    txtUserName.setText("");
                    txtPassword.setText("");
                    txtUserName.requestFocus();
            }

我认为,除了“中断”声明之外,你还有一个逻辑错误。您说过“如果输入正确,错误信息将显示两次”。因此,我们需要退出循环或停止对成功的迭代,因此在成功案例中添加一个“break”语句。如果您不想中断循环,那么可以简单地使用“continue”和标志变量。如果案例成功,请将标志更新为1。(记得在创建时将标志初始化为0)。在继续进行成功案例之前,检查flag的值,根据它的不同,中断或继续下一次迭代。

Hm,我不明白为什么要用这种方式检查登录。使用另一个sql查询更方便:

'select count(*) from employee where username = @username and password = @password'
用输入值替换
@username
@password
,如果语句的结果为0,则输入不正确,如果结果为1,则输入正确


使用此解决方案,您不需要while循环

太好了,我知道这是一个简单的解决办法。我改变了它,但没有把最后一个放进去@Adam是的,
else
在我的示例中强调了接下来会发生什么。它在实际代码中不是必需的。
'select count(*) from employee where username = @username and password = @password'