[JAVA][SQLite] Probleem met insert van gegevens

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Topicstarter
Ik ben bezig met een JAVA programma waar instellingen in een SQLite database worden opgeslagen.
Vreemd genoeg, loop ik nu tegen het volgende probleem aan:

Als ik een rij in een tabel wil toevoegen lijkt dat goed te gaan(Ik krijg geen fouten etc.)
En als ik kijk in het java programma lijkt de rij ook toegevoegd, hij geeft een error als ik dezelfde rij nogmaals toe wil voegen, maar in de SQLite database zie ik niets verschijnen.
Ook is de rij na een herstart van het programma weer verdwenen en kan ik de gegevens gewoon opnieuw invoeren.
Via een SQLite programma (SQLite database browser) kan ik wel gewoon rijen toevoegen zonder problemen.
Nu heb ik wel wat gelezen over commit, maar zodra ik de database het commit commando geef geeft hij de error "SQLite3 Exception: SQL logic error or missing database"

Mijn 'insert methode:'

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public boolean insertAuthenticationData(String databasename, String username,
            int rightslevel) {

        try {

            PreparedStatement ps= ConnectSQLiteSettings
                    .getConnection()
                    .prepareStatement(
                            "INSERT INTO databaseuser (DatabaseName,DatabaseUser,Rights) VALUES (?,?,?);");

            ps.setString(1, databasename);
            ps.setString(2, username);
            ps.setInt(3, rightslevel);

            ps.execute();
            ps.close();

        } catch (SQLException e) {

            System.out.println(e.getMessage());

            return false;
        }
        System.out.println("inserted the user");
        return true;

    }


Het zelfde gebeurt met een update.

Zodra ik de code aanpas met het volgende:
Java:
1
2
3
        conn.setAutoCommit(false);
            ps.execute();
            conn.setAutoCommit(true);

krijg ik de volgende fout:
SQL logic error or missing database

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:54

Janoz

Moderator Devschuur®

!litemod

Toch denk ik dat je het wel in de commit hoek moet zoeken. Waarschijnlijk staat de autocommit standaard op false. waardoor de fout inderdaad pas optreed zodra je commit. Het zal iig het gedrag verklaren.

Voeg het commit commando sowieso toe, maar vervang de


System.out.println(e.getMessage());

eens door een

e.printStackTrace()

Niet schrikken door de stacktrace die lang komt, maar gewoon even naar kijken. Waarschijnlijk staat daar ook nog wel een cause tussen met een wat uitgebreidere melding van wat er fout gegaan is.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 17:50

Standeman

Prutser 1e klasse

krijg ik de volgende fout:
SQL logic error or missing database
Ik zie hier niet waar je de referentie van het conn object vandaan hebt.

Normale gang van zaken in pseudo code

* Open een connectie
* prepare een statement met deze connectie
* execute de statement
* commit connectie

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Topicstarter
Dan krijg ik eigenlijk dezelfde melding.
Wat wel opvalt is dat hij alleen een error geeft bij de conn.setAutoCommit(true);
en niet bij de conn.setAutoCommit(false);

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Topicstarter
Standeman schreef op dinsdag 01 juni 2010 @ 11:51:
[...]

Ik zie hier niet waar je de referentie van het conn object vandaan hebt.

Normale gang van zaken in pseudo code

* Open een connectie
* prepare een statement met deze connectie
* execute de statement
* commit connectie
Sorry, ik vond het een beetje overdreven om heel de ConnectSQLiteSettings.getConnection(); klasse erbij te voegen aangezien een SELECT wel werkt.

*oeps had al gereageerd hiervoor XD *

Voor de volledigheid nog even de connect klasse:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectSQLiteSettings {
    private static Connection cConnection;

    /**
     * Constructor
     * 
     * @param filename
     */
    public ConnectSQLiteSettings(String filename) {
        // make connection
        ConnectDatabase(filename);

    }

    /**
     * Creates the connection to the database
     * 
     * @param filename
     *            the path to the database
     */
    private void ConnectDatabase(String filename) {
        try {
            Class.forName("org.sqlite.JDBC");
            cConnection = DriverManager
                    .getConnection("jdbc:sqlite:" + filename);
            
            

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * get the connection
     * 
     * @return connection
     */
    public static Connection getConnection() {

        return cConnection;
    }

}

Connectie gebeurt via:
Java:
1
2
ConnectSQLiteSettings connect = new ConnectSQLiteSettings(
            "settings.sqlite");

[ Voor 56% gewijzigd door Afvalzak op 01-06-2010 12:27 . Reden: Aanvulling ]

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Topicstarter
Kickje!

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 17:50

Standeman

Prutser 1e klasse

Dan krijg ik eigenlijk dezelfde melding.
Wat wel opvalt is dat hij alleen een error geeft bij de conn.setAutoCommit(true);
en niet bij de conn.setAutoCommit(false);
Dat is logisch. Als autocommit aan staat worden de statements automatisch gecommit. Daarna zijn er geen statements meer die gecommit kunnen worden.

Ik zie verder niets wat fout zou moeten gaan. Misschien een bug in je jdbc driver?

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Topicstarter
Standeman schreef op woensdag 02 juni 2010 @ 11:57:
[...]

Dat is logisch. Als autocommit aan staat worden de statements automatisch gecommit. Daarna zijn er geen statements meer die gecommit kunnen worden.

Ik zie verder niets wat fout zou moeten gaan. Misschien een bug in je jdbc driver?
Het vreemde vind ik het volgende:
ik heb 2 sqlite databases, een voor de instellingen en ander voor de daadwerkelijke data.
De database met de data heb ik geen problemen mee, daar kan ik opslaan en updaten etc.
Maar de instellingendb daar kan ik niets opslaan.
En nog vreemder is dat ik na een executable jar file gemaakt te hebben en het te testen op Mac OS X het daar wel op werkte.
Maar op Linux/Windows XP/7 niet:S

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 18:50
Als ik zoek op de term:
SQL logic error or missing database
krijg ik een lijst met mogelijk oorzaken te zien.
Misschien is een daarvan een mogelijk oplossing.

b.v.:
-null waardes in non-null velden
-geen lees/schrijfrechten
-niet ingelogd op de database
-database is niet aangemaakt
-etc.

let the past be the past.


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Topicstarter
SPee schreef op woensdag 02 juni 2010 @ 12:04:
Als ik zoek op de term:

[...]


krijg ik een lijst met mogelijk oorzaken te zien.
Misschien is een daarvan een mogelijk oplossing.

b.v.:
-null waardes in non-null velden
-geen lees/schrijfrechten
-niet ingelogd op de database
-database is niet aangemaakt
-etc.
Ja dat heb ik ook gelezen, maar het is wel vreemd dat de waardes pas weer verwijdert worden als ik het programma afsluit, tijdens het gebruiken van het programma worden de instellingen allemaal bewaard. (columnsizes etc.)
Alleen na afsluiten zijn ze weer weg.


Misschien dat de JDBC driver problemen heeft met 2 connecties naar verschillende databases tegelijk o.i.d. ik zal kijken of ik daar een oplossing voor kan vinden.

[ Voor 11% gewijzigd door Afvalzak op 02-06-2010 12:13 ]

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Topicstarter
Okay ik heb het probleem inderdaad opgelost door een andere JDBC driver te gebruiken.
Ik gebruik nu deze:
SqliteJDBC - xerial
In plaats van deze:
SqliteJDBC - zentus

Dank voor alle hulp:)

Last.fm | Code Talks


Acties:
  • 0 Henk 'm!

  • Standeman
  • Registratie: November 2000
  • Laatst online: 17:50

Standeman

Prutser 1e klasse

Wel nog even kijken of hier al een bug-report voor is. Zo niet er eentje maken. Zo kan je namelijk nog wat bijdragen :)

The ships hung in the sky in much the same way that bricks don’t.


Acties:
  • 0 Henk 'm!

  • Afvalzak
  • Registratie: Oktober 2008
  • Laatst online: 31-08 12:02

Afvalzak

Zet jij mij even buiten?

Topicstarter
Standeman schreef op woensdag 02 juni 2010 @ 16:39:
Wel nog even kijken of hier al een bug-report voor is. Zo niet er eentje maken. Zo kan je namelijk nog wat bijdragen :)
Dat was ik van plan, maar ik kon nergens een issue/bugtracker o.i.d. vinden.
E-mailadres ook niet.

Last.fm | Code Talks

Pagina: 1