Java i SQLite

0

Witam
Mam taki problem. Chciałem wykorzystać sqlite do mojej aplikacji webowej, zamiast mssqla (to byłby przerost formy nad treścią, w każdym razie nie miałem żadnych problemów z łączeniem się z tą bazą). Po przegooglowaniu nie mam już absolutnie żadnego pomysłu na połączenie się z sqlitem. Oto kod:

            import java.sql.*;
            //(...)

            String driverName = "org.sqlite.JDBC";
            String connectionUrl = "jdbc:sqlite:baza.db";

            Class.forName(driverName);
            Connection con = DriverManager.getConnection(connectionUrl);
            
            String SQL = "SELECT pass FROM user WHERE name='"+request.getParameter("login")+"'";

            Statement st = con.createStatement();

            ResultSet rs = st.executeUpdate(SQL);
            
            if(rs.getString("pass").equals(request.getParameter("password")))
            {
                out.println("Hasło poprawne");
            }
            
            while( rs.next())
            {
                out.println(rs.getString("pass"));
            }

            rs.close();
            st.close();
            con.close();
            
            }

Pomimo tego co tam chcę wyciągać i z tym dalej robić dostaje błąd :

java.sql.SQLException: no such table: user

Zaręczam, że tabela istnieje.
CLASSPATH została dopisana.
sqlitejdbc-v056.jar zostało dołączone do library projektu.

Czy ktoś wie gdzie popełniam błąd?

Dodam, że środowisko to NetBeans IDE 6.8

0

Mam większe zaufanie do sterownika niż do Ciebie. Zatem tabeli user nie ma w tej bazie, z którą się łączysz.

0

W jaki katalogu znajduje się plik baza.db ?
Jak odpalasz program ? gdzie jest jego katalog roboczy ?
Czemu nie użyjesz HSQLDB zamiast SQLite ? :P

0

Czy SQLite jest "Case Sensitive" jeżeli chodzi o nazwy baz lub tabel? Czasem może to leżeć w gestii OS. Sprawdż dokładnie: user czy User? Ja też jestem skłonny zaufać prędzej JDBC niż tobie :)

0

I jeszcze jedna uwaga. Niby w javie nie da się zrobić SQL Injection, ale twój kod aż prosi się o zhakierowanie bo korzystasz bezpośrednio z parametru requestu.


            String SQL = "SELECT pass FROM user WHERE name='?'";

            PreparedStatement st = con.createPreparedStatement();
            st.setString(1, request.getParameter("login"));

            ResultSet rs = st.executeQuery();

Mała różnica, a jak dużo zmienia.

0

Tabela user istnieje bo stworzyłem ją SQLite Database Browserem i nazwa jest poprawna ( z małej litery). Dlaczego SQlite? Bo wcześniej łączyłem ją z delphi i nie było żadnych problemów.

Plik baza.db znajduje się w katalogu projektu c:\Documents and Settings"moja nazwa użytkownika"\Moje dokumenty\NetBeanProjects"mój projekt"\ .

Uruchamiam projekt wciskając klawisz F6.

0

kiedys sie bawilem sqllite moze moj fragment kodu ci pomoze

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

/**
 * Klasa komunikująca się z bazą danych za pomocą zapytań sql.
 */
public class Sql {
        /**
         * Połączenie z bazą.
         */
        private Connection connection;
        /**
         * Zapytania.
         */
        private Statement statement;
        
        /**
         *Tworzenie połączenia z bazą o podanej nazwie.
         *@throws IOException
         *@throws Exception
         */
        public Sql() throws IOException, Exception
        {
                boolean exists = (new File("FS_baza.db")).exists();
            if(!exists){
                CreateDatabase database = new CreateDatabase();
            }
                this.connection = getConnection();
                this.statement = connection.createStatement();
                
        }
        
        /**
         *Zakończenie połączenia z bazą.
         *@throws SQLException
         */     
        public void disconnect() throws SQLException
        {
                this.connection.close();
        }
        /**
         *Pobranie hasła dla podanego loginu.
         *@param login
         *@return haslo
         *@throws SQLException
         */     
        public String getHaslo(String login) throws SQLException
        {
                String zapytanie = "SELECT haslo FROM Uzytkownik WHERE login='"+login+"'";
                boolean executeDone= statement.execute(zapytanie);//executeQuery
                
                ResultSet result = null;
                String haslo = null;
                
                if(executeDone)
                {                               
                        result = statement.getResultSet();
                                                        
                        while (result.next())
                        {
                                haslo = result.getString(1);
                        }
                        result.close(); 
                }
                return haslo;
        }

//metoda laczaca z baza w danym miejscu na dysku
        /**
         *metoda laczaca z baza w danym miejscu na dysku
         *@throws SQLException
         *@throws IOException
         *@throws Exception
         */
        public  Connection getConnection() throws SQLException, IOException, Exception
        {
        Class.forName("org.sqlite.JDBC");
        return DriverManager.getConnection("jdbc:sqlite:FS_baza.db");           
        }

A tu klasa tworzaca baze

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;


/**
 * Klasa tworząca bazę danych.
 */
        public class CreateDatabase {
                /**
                 * Połączenie z biblioteką, tworzenie bazy i zapisanie jej do pliku.
                 * @throws ClassNotFoundException
                 * @throws SQLException
                 */
                public CreateDatabase() throws ClassNotFoundException, SQLException
                {
                Class.forName("org.sqlite.JDBC");
                
                        /**
                         *Połączenie z bazą
                         */
                Connection conn = DriverManager.getConnection("jdbc:sqlite:FS_baza.db");
                        /**
                         *Tworzenie tabel bazy
                         */
                Statement stat = conn.createStatement();
                stat.executeUpdate("drop table if exists Uzytkownik;");
                stat.executeUpdate("create table Uzytkownik (login String , " +
                                                        "haslo String, nazwisko char(50), " +
                                                        "imie char(30));");
                stat.executeUpdate("drop table if exists Dane;");
                stat.executeUpdate("create table Dane (login text, data text, godzina_zasniecia text" +
                                                        ", godzina_wstania text, stan_po_obudzeniu BOOLEAN,  opis_snu varchar(1000));");
                stat.executeUpdate("drop table if exists Ustawienia;");
                stat.executeUpdate("create table Ustawienia (login text , budzik BOOLEAN, " +
                                                        "powiadomienia BOOLEAN , sciezka_do_dzwieku char(50),faza_snu int);");
                }
        }

Przeanalizuj sobie moze Ci to pomoze

0

Dziękuję za wszystkie sugestie. No więc robi się coraz ciekawiej. Uczepiłem się waszego zaufania co do sterownika jdbc i mieliście rację... poniekąd. Servlet faktycznie nie widzi tabeli utworzonej SQLite database bowserem. Jeżeli stworzyć tabelę w serwlecie to hula aż miło. Tylko że database browser a także wtyczka do firefoxa SQLite manager nie widzą tabeli stworzonej servletem. Czy jest jakiś sposób aby java wyświetliła mi ścieżkę do bazy z którą się łącze? (typu c:...itd) Próbowałem connection.getCatalog() ale wyświetla "null" Może otwieram różne pliki baza.db. Czy może java przechowuje sobie gdzieś te dane(bufor, cache) i mam do nich dostęp a po zamknięciu NetBeansa znikną? Przepraszam za może głupie pytania ale dopiero zaczynam z javą.

[Edit] Pogrzebałem i znalazłem. Otwierałem różne pliki baza.db. Ten który dołączyłem do katalogu projektu w ogóle nie był używany. Natomiast w program files\sges-v3\glassfish\domain pojawiła się moja baza do której odwoływał się servlet. Skąd moja baza.db się tam wzięła pozostanie tajemnicą.

0

@tutankhamun, musiałbyś pogrzebać w kodzie sterownika. No i najważniejsze pytanie czy utworzenie tabeli nie wymaga zatwierdzenia tak by inni użytkownicy mogli ją zobaczyć?

0

Próbowałem z funkcją .Commit() to wypluło exception, że sqlite in auto-commit mode.

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