与SQL登录相关的Java

与SQL登录相关的Java,java,sql-server,Java,Sql Server,当我登录时,一切都很完美。但当我输入一个不存在的帐户时,一个消息对话框会根据数据库中的帐户数循环。我相信这是因为我使用了while(rss.next())。 这是我的密码: try { if(e.getSource()==loginButton){ int count = 1; conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=login_DB;in

当我登录时,一切都很完美。但当我输入一个不存在的帐户时,一个消息对话框会根据数据库中的帐户数循环。我相信这是因为我使用了
while(rss.next())
。 这是我的密码:

try {
    if(e.getSource()==loginButton){
        int count = 1;
        conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=login_DB;integratedSecurity=true");
        st=conn.createStatement();
        rss=st.executeQuery("select * from tblLogin");
        while(rss.next()){
            String user = rss.getString(1);
            String pass = rss.getString(2);
            if(usernameTF.getText().equals(user)&&passwordTF.getText().equals(pass)){
                JOptionPane.showMessageDialog(null,"YEAAAA");
            }//if success

            else {
                JOptionPane.showMessageDialog(null,"Account doesn't exist! Please try again.");
            }
        }//while
    }//getsource loginButton

做这样的事

int flag = 0;
if(usernameTF.getText().equals(user) && passwordTF.getText().equals(pass))
{
    flag=1; // if found then, value change to 1 otherwise it will be 0
}

//Now, put below condition after while loop
if (flag==1) {
    JOptionPane.showMessageDialog(null,"YEAAAA");
}
else {
    JOptionPane.showMessageDialog(null,"Account doesn't exist! Please try again.");                
}


正如@Thilo所建议的,您可以在
SELECT
查询中使用
WHERE
子句

您需要使用一个局部变量,如我在下面设置的“found”。找到匹配项后,打印消息并将“已找到”标记为true。退出循环后,检查find的值,并根据需要打印错误消息

if(e.getSource()==loginButton){
        int count = 1;
        conn=DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=login_DB;integratedSecurity=true");
        st=conn.createStatement();
        rss=st.executeQuery("select * from tblLogin");
        boolean found = false;
        while(rss.next()){
        String user = rss.getString(1);
        String pass = rss.getString(2);
        if(usernameTF.getText().equals(user)&&passwordTF.getText().equals(pass)){
            JOptionPane.showMessageDialog(null,"YEAAAA");
            found = true;
        }//if success
        }//while
    if(found)
            JOptionPane.showMessageDialog(null,"Account doesn't exist! Please try again.");
}//getsource loginButton

不要从TblLogin中选择all,而是在查询中放入WHERE子句,这样它只会从该用户名为true的数据库中提取,然后(假设每个帐户只有一个用户名),如果用户名存在,将返回一个结果,然后您可以根据所用内容比较哈希或密码。例如:

String queryCriteria = "SELECT Username, Password FROM TblLogin WHERE Username = ? ";

 statement= connection.prepareStatement(queryCriteria );
  statement.setString(1,usernameEntered);
  resultSet = stmt.executeQuery();

为什么不使用WHERE子句只获取候选记录(实际上最多应该是一个),而不是所有记录呢?我创建了一个数据库,它只有一个表,只有用户名和密码。我知道这很愚蠢,哈哈哈,但是我还在练习在两者之间建立联系。好主意:D它真的起作用了!如果出现逻辑问题,我会告诉你,最好使用
boolean
标志。还有像
继续
中断
返回
,也用于流控制。@Thilo
布尔
可能是更好的选择。是的,当然,我们可以在对话框代码之前的
else
条件中使用
continue
。但是,在这种情况下,对话框将永远不会弹出。:)我明白你的意思,但你能解释一下“如果(发现)”怎么办吗?我是新来的xD,我是说这是我第一次看到带有表达式的if语句:DThe if(found)tests if found==true,它测试我们是否找到了我们正在寻找的特定帐户