Java FX + SQLite nie odczytuje danych z bazy

0

Zacząłem zabawę z JavąFX i próbuje połączyć się z bazą danych - tutaj jest sukces, wygląda na to że wszystko działa (kontrolka Label wyświetla "Connected"). Problem pojawia się gdy wpisuje username i password, kontrolka powinna zmienić się na "Correct" po wpisaniu poprawnych danych, niestety zamiast tego wywala "Not correct". Niżej kod.

public class SqlConnection {

    public static Connection Connector() {
        try{
            Class.forName("org.sqlite.JDBC");
            Connection conn = DriverManager.getConnection("jdbc:sqlite:employeeDB.sqlite");
            return conn;
        } catch (Exception e){
            System.out.println(e);
            return null;
        }
    }
}

Klasa odpowiedzialna za połączenie z bazą

public class Model {

    Connection connection;

    public Model(){
        connection = SqlConnection.Connector();
        if (connection == null){
            System.exit(1);
        }
    }

    public boolean isDbConnected(){
        try{
            return !connection.isClosed();
        } catch (SQLException e){
            e.printStackTrace();
            return false;
        }
    }

    public boolean isLogin(String user, String pass) throws SQLException {
            PreparedStatement pst = null;
            ResultSet rs = null;
        try{
            String query = "select * from employee where username=? and password=?";

            pst = connection.prepareStatement(query);
            pst.setString(0, user);
            pst.setString(1, pass);

            rs = pst.executeQuery();

            if(rs.next()){
                return true;
            } else {
                return false;
            }
        }catch(Exception e){
            return false;
        }finally {
            if (pst != null) {
                pst.close();
            }
            if (rs != null) {
                rs.close();
            }
        }

    }
}

klasa Model, z metodą isLogin która wysyła zapytanie do bazy

public class Controller implements Initializable {

    public Model login = new Model();

    @FXML
    private Label isConnected;

    @FXML
    private TextField txtUserName;

    @FXML
    private TextField txtPassword;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        if(login.isDbConnected()){
            isConnected.setText("Connected");
        } else isConnected.setText("Not Connected");
    }

    public void login (ActionEvent event)
    {
        try {
            if(login.isLogin(txtUserName.getText(), txtPassword.getText())) {
                isConnected.setText("Correct");
            } else {
                isConnected.setText("Not correct");
            }
        } catch (SQLException e) {
            isConnected.setText("Not Correct");
            e.printStackTrace();
        }
    }

no i controller, który po wywołaniu metody isLogin powinien zwrócić "Correct" jeżeli hasło i login zgadzają się z tymi w bazie, niestety niezależnie co wpiszę - po kliknięciu przycisku (button ma przypisaną metodę login z powyższej klasy) i tak wyświetla się "Not correct".

edit#
po debugowaniu programu zauważyłem, że w pewnym momencie wyskakuje SQLException z dopiskiem "no such table: employee". Z tym, że taka tabela istnieje w bazie...

0

Wydaje mi się, że sprawdzasz czy zapytanie

String query = "select * from employee where username=? and password=?";

zwróciło co najmniej dwa rekordy. Spróbuj tak;

            rs = pst.executeQuery();
            rs.beforeFirst();
            if(rs.next()){
                return true;
            } else {
                return false;
            }
0
bogdans napisał(a):

Wydaje mi się, że sprawdzasz czy zapytanie

String query = "select * from employee where username=? and password=?";

zwróciło co najmniej dwa rekordy. Spróbuj tak;

            rs = pst.executeQuery();
            rs.beforeFirst();
            if(rs.next()){
                return true;
            } else {
                return false;
            }

Czyli po prostu w taki sposób? Niestety, nadal nie działa jak powinno;/

public boolean isLogin(String user, String pass) throws SQLException {
            PreparedStatement pst = null;
            ResultSet rs = null;
        try{
            String query = "select * from employee where username=? and password=?";

            pst = connection.prepareStatement(query);
            pst.setString(0, user);
            pst.setString(1, pass);

            rs = pst.executeQuery();
            rs.beforeFirst();
            if(rs.next()){
                return true;
            } else {
                return false;
            }
        }catch(Exception e){
            return false;
        }finally {
            if (pst != null) {
                pst.close();
            }
            if (rs != null) {
                rs.close();
            }
        }

    }
0
            pst.setString(1, user);
            pst.setString(2, pass);
0
bogdans napisał(a):
            pst.setString(1, user);
            pst.setString(2, pass);

Właśnie też to wyłapałem, niestety również nie pomogło.

0

To zmień query na

String query = "select username,password from employee";

wyświetl na ekranie całe rs oraz user oraz pass i sprawdź czy na pewno gdzieś jest równość. Możesz też wyświetlać wartości wyrażeń
rs.getString("username").equals(user);
rs.getString("password").equals(pass);

0
String query = "select username, password from employee";

            pst = connection.prepareStatement(query);    
            rs = pst.executeQuery();
            user = rs.getString("username");
            pass = rs.getString("password");
            System.out.println(user + " " + pass);

wyświetla username i password takie jak zapisane są w bazie

0

Powyższy kod niczego nie sprawdza, wyświetl to:

rs.getString("username").equals(user);
rs.getString("password").equals(pass);
0
String query = "select username,password from employee";
            pst = connection.prepareStatement(query);
            rs = pst.executeQuery();

            System.out.println(rs.getString("username").equals(user));
            System.out.println(rs.getString("password").equals(pass)); 

gdy wpiszę to co w bazie, zwraca 2x true
gdy wpiszę coś innego - false... tak więc tutaj jest w porządku

0

Teraz używasz nazw kolumn z tabeli employee, przedtem używałeś indeksów kolumn. Czy kolumny username i password to na pewno dwie pierwsze kolumny w tabeli?

0
bogdans napisał(a):

Teraz używasz nazw kolumn z tabeli employee, przedtem używałeś indeksów kolumn. Czy kolumny username i password to na pewno dwie pierwsze kolumny w tabeli?

Hmm, chyba nie bardzo rozumiem

 pst.setString(1, user);
 pst.setString(2, pass);

wpisanie tutaj jakichkolwiek innych wartości niż 1 i 2 powoduje błąd
Cannot resolve query parameter

Baze danych ograniczyłem już do 1 tabeli z jedynie 2 kolumnami - username i password, nadal nic...

edit#

wyrzuciłem to co sugerowałeś w 1 poście

rs.beforeFirst();

Nagle działa jak powinno... na wszystkich bazach, łącznie z tą gdzie username i password faktycznie nie jest 1 i 2 kolumną.
Ktoś mi wyjaśni o co chodzi? ;d

1 użytkowników online, w tym zalogowanych: 0, gości: 1