Przeglądanie danych w bazie.

0

Witam mam metodę, która ma sprawdzić czy w bazie znajduje się użytkownik o podanym loginie i haśle, po czym sprawdzany jest typ konta i zwracany odpowiedni typ konta. Jednak poniższa metoda zawsze zwraca mi błąd. Czemu tak się dzieje? Do tabeli wrzuciłem 1 użytkownika, który ma login admin hasło admin i typ admin, więc wszystko powinno się zgadzać a zwracany jest za każdym razem "Błąd" zamiast "Admin". Zauważyłem, że niestety metoda nie wchodzi dalej niż

dane = this.getData("select * from uzytkownicy");

nie wchodzi w ogóle do tego while'a.

    String logowanie(String login, String haslo) {

        ResultSet dane;
        try {
            dane = this.getData("select * from uzytkownicy");
            while (dane.next()) {
                System.out.println(dane.getString(4));
                System.out.println(dane.getString(5));
                System.out.println(dane.getString(11));
                if (login.equals(dane.getString(4)) && haslo.equals(dane.getString(5))) {
                    if (dane.getString(11).equals("admin")) {
                        return "admin";
                    }
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(BazaDanych.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "Błąd";
    } 

Metoda getData:

    public ResultSet getData(String sql) {

        if (connected) {
            ResultSet rc = null;
            Statement st = null;
            try {
                st = con.createStatement();
                rc = st.executeQuery(sql);
            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, "Nie udalo sie wykonac: " + sql + " " + e.getMessage(), "Błąd", JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            };
            return rc;
        }
        JOptionPane.showMessageDialog(null, "Nie jestes podlaczony" + sql, "Błąd", JOptionPane.ERROR_MESSAGE);
        return null;
    } 

A tabela wygląda tak, więc wszystko powinno być ok.

create table uzytkownicy (
  id_uzytkownika number(6,0) constraint uzytkownicy_pk primary key,
  imie varchar2(15),
  nazwisko varchar2(25),
  login varchar(25),
  haslo varchar(25),
  pesel varchar(11),
  miasto varchar(25),
  ulica varchar(30),
  telefon varchar(15),
  mail varchar(25),
  typ varchar(25)
); 

i insert do niej

insert into uzytkownicy(imie, nazwisko, login, haslo, pesel, miasto, ulica, telefon, mail, typ) values ('admin', 'admin', 'admin', 'admin', 'admin', 'admin', 'admin', 'admin', 'admin','admin');
1

wchodzi do metody getData? tam nie rzuca żadnego wyjątku? obiekt con nie jest nullem ?

0

Nie wyrzuca nic. Obiekt nullem nie jest. Dałem tekst do wyświetlenia gdzie jest program i mam takie coś:

        try {
            System.out.println("Witam");
            dane = this.getData("select * from uzytkownicy");
            System.out.println("Witam");
            while (dane.next()) {
                System.out.println("Witam");
                System.out.println(dane.getString(4));
                System.out.println(dane.getString(5));
                System.out.println(dane.getString(11));
                if (login.equals(dane.getString(4)) && haslo.equals(dane.getString(5))) { 

Witam wyświetla mi 2 razy, czyli tak jakby to while'a nie wchodzi.

1

Możesz poza programem sprawdzić, że tabela uzytkownicy jest niepusta?

0

Sprawdzałem select * from użytkownicy w SQL Developerze i jest 1 wpis dokładnie taki jak insert.

1

Sprawdź co sie pojawi na konsoli

            dane = this.getData("select * from uzytkownicy");
            dane.first();
            System.out.println(dane.getString(4));
            System.out.println(dane.getString(5));
            System.out.println(dane.getString(11));
            while (dane.next()) {
                System.out.println("Witam");
                System.out.println(dane.getString(4));
                System.out.println(dane.getString(5));
                System.out.println(dane.getString(11));
1

wypisuj "witaj" w metodzie getData. Na pewno wykonuje tam zapytanie?

0

Wrzuciłem do:

        if (connected) {
            ResultSet rc = null;
            Statement st = null;
            System.out.println("Witam Cie"); 

I wypisuje to.

1

to nie świadczy o tym ze zapytanie sie wykonalo

0

Czyli co jeszcze może być nie tak? Ja już nie mam pojęcia.

1

Umiesz czytać? Jaki jest efekt poleceń

dane = this.getData("select * from uzytkownicy");
dane.first();
System.out.println(dane.getString(4));
System.out.println(dane.getString(5));
System.out.println(dane.getString(11));
0

Wywala:

lut 18, 2013 241 PM Serwer.BazaDanych logowanie
SEVERE: null
java.sql.SQLException: Niepoprawna operacja dla zestawu wyników "tylko do przesłania" : first
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
at oracle.jdbc.driver.BaseResultSet.first(BaseResultSet.java:77)
at Serwer.BazaDanych.logowanie(BazaDanych.java:122)
at Serwer.Serwer2$ObslugaKlientow$DekodujWiadomosc.run(Serwer2.java:72)
at Serwer.Serwer2$ObslugaKlientow.run(Serwer2.java:125)
at java.lang.Thread.run(Thread.java:722)

1

To zmień jeszcze

st = con.createStatement();
//na
st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);

To pozwoli na wędrowanie po ResultSet w obu kierunkach.

0

I wykonać to samo po tej zmianie? Daje mi to:

lut 18, 2013 306 PM Serwer.BazaDanych logowanie
SEVERE: null
java.sql.SQLException: Wyczerpany zestaw wyników
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445)
at oracle.jdbc.driver.ScrollableResultSet.getOracleObject(ScrollableResultSet.java:514)
at oracle.jdbc.driver.ScrollableResultSet.getString(ScrollableResultSet.java:534)
at Serwer.BazaDanych.logowanie(BazaDanych.java:123)
at Serwer.Serwer2$ObslugaKlientow$DekodujWiadomosc.run(Serwer2.java:72)
at Serwer.Serwer2$ObslugaKlientow.run(Serwer2.java:125)
at java.lang.Thread.run(Thread.java:722)

1

Wygląda, że ResultSet jest pusty. Na pewno odczytujesz dane z tej samej bazy, z której z której czyta SQL Developer?

0

Mam jakiś problem z tą bazą. Załóżmy, że usunę wszystkie tabele, dodam je a potem dodam 1 wpis do tabeli użytkownicy. To potem jak chcę zobaczyć zawartość tabeli w apexie to dostaję komunikat:

failed to parse SQL query: ORA-01031: insufficient privileges

Tak samo dodając wpisy w SQL widzę je tylko w SQL a w APEXie nie. Jednak jak dodałem 1 wpis w programie to widziałem go w apexie a w SQL nie...

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