einfache Frage bei DB-Zugriff

ernst

Top Contributor
Hallo allerseits,
in meinem einfachen Demo-Programm unten greife ich auf eine ACCESS-DB zu.
Dabei habe ich folgendes Problem mit dem ResultSet:
Es wird ein ResultSet erzeugt und dann innerhalb der Methode
mArtikel.sucheArtikel(pDBVerbindung);
nochmals ein ResultSet erzeugt.
Dann bekomme ich die Fehlermeldung:
Exception in thread "main" java.lang.Throwable: Datensatz in erzeugeListe konnte nicht gelesen werden
at w2006aenr2ver1.Artikelliste.erzeugeListe(MainW2006AENr2Ver1.java:177)
at w2006aenr2ver1.MainW2006AENr2Ver1.main(MainW2006AENr2Ver1.java:20)
Java Result: 1
Was habe ich falsch gemacht?
Wie kann ich den Fehler beseitigen?

mfg
Ernst
----------------------------------------------------------------------------------------

Java:
        mySQL = "SELECT ArtNr, Bezeichnung, Lagerbestand, KleinBestPreis, GrossBestPreis, Lieferzeit FROM tblArtikel ";
        rsA = pDBVerbindung.executeQuery(mySQL);
        mArtikel = new Artikel[anzahl];
        for(i=0;i<anzahl;i++){
            mArtikel[i]=new Artikel();
        }

        for(i=0;i<anzahl;i++){
            try {
                b=rsA.next();
                if(b==false){
                    break;
                }
                // ArtNr dem ResultSet entnehmen
                // ---------- Hier gibt es Probleme -----------
                artNr = rsA.getString("ArtNr");
                // Setze ArtNr im i-ten Element
                mArtikel[i].setArtNr(artNr);
                // Suche nach diesem Artikel
                mArtikel[i].sucheArtikel(pDBVerbindung);  // <--- diese Methode benutzt wieder einen ResultSet 
            } catch (Throwable t) {
                t = new Throwable("Datensatz in erzeugeListe konnte nicht gelesen werden");
                throw t;
            }


    public void  sucheArtikel(DBConnection pDBConnection) throws Throwable {
        // der gefundene Artikel
        String mSQL;
        ResultSet rsA;
        mSQL = "SELECT ArtNr, Bezeichnung, Lagerbestand, KleinBestPreis, GrossBestPreis, Lieferzeit FROM tblArtikel ";
        mSQL = mSQL + "WHERE ArtNr = '" + artNr + "';";

        rsA = pDBConnection.executeQuery(mSQL);

        try {
            //System.out.println("mSQL="+mSQL);
            rsA.next();
            //artikelnummer = rsA.getString("Artikelnummer");
            bezeichnung = rsA.getString("Bezeichnung");
            lagerbestand = rsA.getInt("Lagerbestand");
            kleinBestPreis = rsA.getDouble("KleinBestPreis");
            grossBestPreis = rsA.getDouble("GrossBestPreis");
            lieferzeit = rsA.getInt("Lieferzeit");
        } catch (Throwable t) {
            t = new Throwable("Datensatz in sucheArtikel konnte nicht gelesen werden");
            throw t;
        }
        rsA.close();
    }
}

...


Hier das ganze Programm:
Java:
package w2006aenr2ver1;

import java.sql.*;

public class MainW2006AENr2Ver1 {

    public static void main(String[] args) throws Throwable {
        int anz;
        int i;
        DBZugriff dbZugriff;
        dbZugriff = new DBZugriff();
        Artikel artikel;
        artikel = new Artikel();
        artikel.setArtNr("1");
        //artikel.sucheArtikel(dbZugriff.getVerbindung());
        System.out.println("artikel-Bezeichnung="+artikel.getBezeichnung());
        Artikelliste al;
        al = new Artikelliste();
        // Hier gibt es Probleme
        al.erzeugeListe(dbZugriff.getVerbindung());
        anz = al.getmArtikel().length;
        for(i=0;i<anz;i++){
            System.out.println("Artnr="+al.getmArtikel()[i].getArtNr());
        }



    }
}

class Artikel {
    private String artNr;
    private String bezeichnung;
    private int lagerbestand;
    private double kleinBestPreis;
    private double grossBestPreis;
    private int lieferzeit;

    Artikel() {
    }

    public Artikel(String ArtNr, String bezeichnung, int lagerbestand, double kleinBestPreis, double grossBestPreis, int lieferzeit) {
        this.artNr = artNr;
        this.bezeichnung = bezeichnung;
        this.lagerbestand = lagerbestand;
        this.kleinBestPreis = kleinBestPreis;
        this.grossBestPreis = grossBestPreis;
        this.lieferzeit = lieferzeit;
    }

    public void setArtNr(String artNr) {
        this.artNr = artNr;
    }


    public void setBezeichnung(String bezeichnung) {
        this.bezeichnung = bezeichnung;
    }

    public void setGrossBestPreis(double grossBestPreis) {
        this.grossBestPreis = grossBestPreis;
    }

    public void setKleinBestPreis(double kleinBestPreis) {
        this.kleinBestPreis = kleinBestPreis;
    }

    public void setLagerbestand(int lagerbestand) {
        this.lagerbestand = lagerbestand;
    }

    public void setLieferzeit(int lieferzeit) {
        this.lieferzeit = lieferzeit;
    }

    public String getArtNr() {
        return artNr;
    }

    public String getBezeichnung() {
        return bezeichnung;
    }

    public double getGrossBestPreis() {
        return grossBestPreis;
    }

    public int getLagerbestand() {
        return lagerbestand;
    }

    public int getLieferzeit() {
        return lieferzeit;
    }

// Zugriff auf DB (eigentlich schlechtes Design)
    public void  sucheArtikel(DBConnection pDBConnection) throws Throwable {
        // der gefundene Artikel
        String mSQL;
        ResultSet rsA;
        mSQL = "SELECT ArtNr, Bezeichnung, Lagerbestand, KleinBestPreis, GrossBestPreis, Lieferzeit FROM tblArtikel ";
        mSQL = mSQL + "WHERE ArtNr = '" + artNr + "';";

        rsA = pDBConnection.executeQuery(mSQL);

        try {
            //System.out.println("mSQL="+mSQL);
            rsA.next();
            //artikelnummer = rsA.getString("Artikelnummer");
            bezeichnung = rsA.getString("Bezeichnung");
            lagerbestand = rsA.getInt("Lagerbestand");
            kleinBestPreis = rsA.getDouble("KleinBestPreis");
            grossBestPreis = rsA.getDouble("GrossBestPreis");
            lieferzeit = rsA.getInt("Lieferzeit");
        } catch (Throwable t) {
            t = new Throwable("Datensatz in sucheArtikel konnte nicht gelesen werden");
            throw t;
        }
        rsA.close();
    }
}


class Artikelliste {
    // enthält alle Artikel aus der Datenbank
    private Artikel[] mArtikel;

    public Artikel[] getmArtikel() {
        return mArtikel;
    }

    public Artikelliste() {
    }



    public void erzeugeListe(DBConnection pDBVerbindung) throws Throwable{
        boolean b;
        int i;
        int anzahl=0;
        String mySQL;
        ResultSet rsA;

        String artNr;
        String bezeichnung;
        int lagerbestand;
        double kleinBestPreis;
        double grossBestPreis;
        int lieferzeit;

        anzahl = anzahlArtikel(pDBVerbindung);
        // Nochmals der ResulSet holen, da im alten ResultSet der Zeiger ganz am Ende ist.
        // rsA.beforeFirst(); funktioniert leider nicht wegen FORWARD_ONLY
        //

        mySQL = "SELECT ArtNr, Bezeichnung, Lagerbestand, KleinBestPreis, GrossBestPreis, Lieferzeit FROM tblArtikel ";
        rsA = pDBVerbindung.executeQuery(mySQL);
        mArtikel = new Artikel[anzahl];
        for(i=0;i<anzahl;i++){
            mArtikel[i]=new Artikel();
        }
        
        for(i=0;i<anzahl;i++){
            try {
                b=rsA.next();
                if(b==false){
                    break;
                }
                // ArtNr dem ResultSet entnehmen
                // Hier gibt es Probleme
                artNr = rsA.getString("ArtNr");
                // Setze ArtNr im i-ten Element
                mArtikel[i].setArtNr(artNr);
                // Suche nach diesem Artikel
                mArtikel[i].sucheArtikel(pDBVerbindung);
            } catch (Throwable t) {
                t = new Throwable("Datensatz in erzeugeListe konnte nicht gelesen werden");
                throw t;
            }
        }
        rsA.close();
       
    }

// Länge
    public int anzahlArtikel(DBConnection pDBVerbindung) throws Throwable{
        boolean b;
        int i;
        int anzahl=0;
        String mySQL;
        ResultSet rsA;

        String artNr;
        String bezeichnung;
        int lagerbestand;
        double kleinBestPreis;
        double grossBestPreis;
        int lieferzeit;

        mySQL = "SELECT ArtNr, Bezeichnung, Lagerbestand, KleinBestPreis, GrossBestPreis, Lieferzeit FROM tblArtikel ";
        rsA = pDBVerbindung.executeQuery(mySQL);
        // Länge des ResultSet bestimmen
        do{
            b = rsA.next();
            anzahl++;
        }while (b==true);

        rsA.close();
        return(anzahl);
    }
}


/*
Hier wird die Verbindung zur Datenbank aufgebaut.
Die Verbindung wird charakterisiert durch 3 Zustände:
- Datenquelle: Datei
- Connection: Die eigentliche Anbindung
- Statement: Möglichkeit Datenbankanfragen zu stellen
Diese werden in der Klasse DBConnection verwaltet.
*/
class DBZugriff {
    private DBConnection DBVerbindung;

    public DBZugriff() throws Throwable{
        DBVerbindung = new DBConnection();
        // Die o.g. 3 Zustände werden geeignet initialisiert und in
        // DBVerbindung gespeichert.
        aufbaueVerbindung();
    }

    //public void oeffneDB() throws SQLException{
    public void aufbaueVerbindung() throws SQLException {
        String datenQuelle;
        Connection connectionDB;
        Statement statementSQL;
        try {
            // Lädt die Klasse mit dem Namen "sun.jdbc.odbc.JdbcOdbcDriver"
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // Variable für den Treiber und den Pfad zur DB (Deklaration und Wertzuweisung)
            // getConnection(...) benötigt 3 Parameter:
            // eine Datenquelle, einen User, ein Passwort
            // eine Datenquelle ist wie folgt aufgebaut:
            // jdbc:Subprotokoll:Datenquellennamen
            // Für ODBC-Datenquellen ist das Subprotokoll obcd
            //
            datenQuelle = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=H:/Daten_Austausch/dBMSAccess2.mdb";

            // getConnection(...) liefert die Verbindung zur Datenbank zurück.
            // obenstehender Pfad muss jeweils angepasst werden!
            connectionDB = DriverManager.getConnection(datenQuelle, "", "");
            statementSQL = connectionDB.createStatement();
            //DBVerbindung.setConnectionDB(connectionDB);
            //DBVerbindung.setDatenQuelle(datenQuelle);
            DBVerbindung.setStatementSQL(statementSQL);
        } catch (SQLException fehler) {
            fehler = new SQLException("Treiber existiert nicht");
            throw fehler;
        } catch (ClassNotFoundException fehler) {
            System.out.println("Treiber existiert nicht");
            fehler.printStackTrace();
        }
    }


    public void abbauenVerbindung() throws SQLException {
        try {
            DBVerbindung.getConnectionDB().close();
            DBVerbindung.getStatementSQL().close();
        } catch (SQLException fehler) {
            fehler = new SQLException("DB konnte nicht geschlossen werden");
            throw fehler;
        }
    }

    public DBConnection getVerbindung() throws SQLException {
        aufbaueVerbindung();
        return DBVerbindung;
    }
}


/*
Die Verbindung wird charakterisiert durch 3 Zustände:
- Datenquelle: Datei
- Connection: Die eigentliche Anbindung
- Statement: Möglichkeit Datenbankanfragen zu stellen
*/

class DBConnection {
    private String datenQuelle;
    private Connection connectionDB;
    private Statement statementSQL;

    public DBConnection(){
    }
    public Connection getConnectionDB() {
        return connectionDB;
    }

    public String getDatenQuelle() {
        return datenQuelle;
    }

    public Statement getStatementSQL() {
        return statementSQL;
    }

    public void setConnectionDB(Connection connectionDB) {
        this.connectionDB = connectionDB;
    }

    public void setDatenQuelle(String datenQuelle) {
        this.datenQuelle = datenQuelle;
    }

    public void setStatementSQL(Statement statementSQL) {
        this.statementSQL = statementSQL;
    }

    public ResultSet executeQuery(String sqlString) throws SQLException{
        ResultSet rs;
        try{
            rs = statementSQL.executeQuery(sqlString);
        } catch (SQLException fehler) {
            fehler = new SQLException("Fehler bei rs = statementSQL.executeQuery(sqlString);");
            throw fehler;
        }
        return rs;
    }
}
 

XHelp

Top Contributor
Lass dir doch fürs erste die Exception ausgeben, die auch wirklich fliegt. Die wird bestimmt aussagekräftiger als "Joar, da ist ein Fehler passiert".
Außerdem wenn du Fehlerangaben mit Zeilen postest, dann solltest du auch auf die entsprechenden Zeilen hinweisen.
 

DerEisteeTrinker

Bekanntes Mitglied
Überprüfe, ob die Verbindung wirklich besteht, dann schau nach ob die Bezeichnungen alle richtig sind und dann kannst du ja mal debuggen und nachsehen, was in der ergebnismenge drinsteht. vllt gehst in deiner schleife zu weit in der ergebnismenge oder ähnliches.
 

ernst

Top Contributor
Lass dir doch fürs erste die Exception ausgeben, die auch wirklich fliegt. Die wird bestimmt aussagekräftiger als "Joar, da ist ein Fehler passiert".
Außerdem wenn du Fehlerangaben mit Zeilen postest, dann solltest du auch auf die entsprechenden Zeilen hinweisen.

Danke für deine Antwort,
In Zeile 165 geschieht die Exception (da gibt es den "Abflug") und zwar beim 2. Durchgang durch die for-Schleife.
(Dann geht es in den catch-Teil Zeile Zeile 177)

mfg
Ernst
 

ernst

Top Contributor
Überprüfe, ob die Verbindung wirklich besteht, dann schau nach ob die Bezeichnungen alle richtig sind und dann kannst du ja mal debuggen und nachsehen, was in der ergebnismenge drinsteht. vllt gehst in deiner schleife zu weit in der ergebnismenge oder ähnliches.

Danke für deine Antwort,
wenn ich z.B. Zeile 175 auskommentiere
// mArtikel.sucheArtikel(pDBVerbindung);
gibt es keinen Fehler mehr

mfg
Ernst
 

ernst

Top Contributor
sprich dann debugge mal die Methode, die da in der Zeile aufgerufen wird

Beim 1. Aufruf von
mArtikel.sucheArtikel(pDBVerbindung);
gibt es noch keine Probleme.
Nach dem 1. Aufruf von
mArtikel.sucheArtikel(pDBVerbindung);
komme ich nicht mehr zum 2. Aufruf von
mArtikel.sucheArtikel(pDBVerbindung);
weil es vorher in Zeile 165 den Abflug gibt (Exception).

mfg
Ernst
 

DerEisteeTrinker

Bekanntes Mitglied
ja klar. du kannst nicht zwei konkurierende ResultSets aufmachen mit deinem executeQuery(). Du musst erst alle Artikelnummern speichern und sie dann nach dem speichern das erste Resultset schließt. Dnan kannst die ArtNr nachschauen in der DB
 

DerEisteeTrinker

Bekanntes Mitglied
Das kommt von der Tatsache, dass du einen ResultSet auch im Nachhinein noch bearbeiten kannst. WO das beschrieben ist? ka, ich weiß es, weil ich den gleichen Fehler am Anfang auch oft gemacht habe, dass geht iwann ins blut über :D
 

XHelp

Top Contributor
Steht so in der API:
http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement.html hat gesagt.:
By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close a statment's current ResultSet object if an open one exists.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
K SQLite Einfache DB-Abfrage Datenbankprogrammierung 2
H Einfache Datenbankabfrage Datenbankprogrammierung 14
C MySQL Einfache Variablenuebergabe Datenbankprogrammierung 2
R Einfache JDBC-Datenbank mit Admin-Client Datenbankprogrammierung 4
E Einfache Abfrage funktioniert nicht Datenbankprogrammierung 3
P einfache DB-Verbindungsklasse Datenbankprogrammierung 4
L einfache Datenbankabfrage ohne erstes Element Datenbankprogrammierung 2
M Frage zu Bundesliga-DB Datenbankprogrammierung 1
pkm Frage zu Encodingproblem bei einer Datenbankanbindung Datenbankprogrammierung 1
B Frage bei einer SQL Query Datenbankprogrammierung 3
B Frage zu Datenbank Design bei Events (ZenDesk) Datenbankprogrammierung 1
B SQLite Frage zu SQLite Datenbankverbindung Datenbankprogrammierung 7
M Frage zu JSON Datenbankprogrammierung 16
Psypsy Hibernate / JPA OneToOne MappedBy Frage Datenbankprogrammierung 2
P Frage zu Connection.close() Datenbankprogrammierung 4
R MySQL Frage zum Anlegen von Artikeln inkl. Verbindungen Datenbankprogrammierung 0
M Grundlegende Klassen-Design Frage Datenbankprogrammierung 0
P MySQL Frage zur Einbindung in ein Java Projekt Datenbankprogrammierung 2
I Frage zu Datenmodellierung Datenbankprogrammierung 3
J Normalisierung - Allgemeine Frage zur 3. Normalform (Eventuelle Abhängigkeit) Datenbankprogrammierung 4
F Normalisierung Datenbank Frage Datenbankprogrammierung 5
J Frage zu ResultSet Datenbankprogrammierung 3
W Frage zur Datenbankwahl bei Umstieg auf Java Datenbankprogrammierung 7
D Frage zu DISTINCT in SQL Datenbankprogrammierung 5
K Frage zur Datenprotokollierung bei DML Anweisungen Datenbankprogrammierung 3
K Frage zu SQL Datenbankprogrammierung 2
L PostgreSQL Hibernate-Frage Datenbankprogrammierung 2
K Frage zu Datenbankmodellierung Datenbankprogrammierung 15
D Generelle Frage zum Umgang mit Datensätzen Datenbankprogrammierung 5
L Frage zu UpdateQuery Datenbankprogrammierung 12
8 MySQL Kurze Frage zur Sicherheit Datenbankprogrammierung 9
D Frage zu INSERTS über mehrere Datenbanktabellen Datenbankprogrammierung 3
D Frage zu Ausführungsmöglichkeiten von SQL Befehlen Datenbankprogrammierung 13
D Frage zu SQL Syntax Datenbankprogrammierung 17
D Frage zu potenziellen Leerzeichen in einer Datenbank Datenbankprogrammierung 5
X Connection schließen oder speichern? Performance Frage Datenbankprogrammierung 7
J mal wieder eine Frage zu parallelen Transaktionen.. Datenbankprogrammierung 2
V Frage zu Hibernate-Mapping Datenbankprogrammierung 11
N Allg. Frage zur Datenbankverbindung Datenbankprogrammierung 2
S MySQL Frage zu LeftJoin Abfrage Datenbankprogrammierung 2
O eigentlich simple SQL Frage Datenbankprogrammierung 2
M Frage zu folgender Query in EJB-QL Datenbankprogrammierung 4
H JBoss: Frage zur Datasource in der ...-ds.xml Datenbankprogrammierung 4
F Frage zu Prepared Statement Datenbankprogrammierung 2
R hibernate Frage zu configFile-Pfad und Groß/Kleinschreibung von Postgres-Tabellen Datenbankprogrammierung 8
U Frage zum Erfassen von hinzufügten und entfernten Objekten Datenbankprogrammierung 9
M prinzipielle Frage zu Datenbanken und jars ... Datenbankprogrammierung 2
S Hibernate - spezielle Frage, n zu n Beziehung Datenbankprogrammierung 11
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
J Frage zu Synchronisation bei parallelem Zugriff, speziell mit JPA Datenbankprogrammierung 2
F EclipseLink persistence.xml Frage Datenbankprogrammierung 11
N Frage zur Sicherheit von Konfigurationsdatei Datenbankprogrammierung 4
H performance frage Datenbankprogrammierung 9
G Frage zum Insert-Statement Datenbankprogrammierung 2
Antoras Design-Frage: Datenzuordnung zu verschiedenen Accounts Datenbankprogrammierung 2
T HSQL: verständnis Frage Datenbankprogrammierung 2
T Java JPA Frage bzgl. DISTINCT Datenbankprogrammierung 2
G Frage zu connection? Datenbankprogrammierung 9
A Frage zu SQL-Abfrage Datenbankprogrammierung 2
G Frage zu SQL "WHERE IN (1, 2, 3. , N)" Datenbankprogrammierung 8
G Allgemeine Frage zu Datenbanklimits Datenbankprogrammierung 27
G allgemeine JDBC-Connection Frage Datenbankprogrammierung 2
G Frage zu Hibernate und M:N Beziehung Datenbankprogrammierung 9
K HQL Frage Datenbankprogrammierung 10
D kurze Frage zu einem Query Datenbankprogrammierung 6
B Hibernate mit MySql - Verständniss Frage Datenbankprogrammierung 8
N Kleine Frage zu Connection Pooling mit DataSource Datenbankprogrammierung 2
T Update-Frage Datenbankprogrammierung 11
E SQL-Frage (Löschen aller Datensätze) Datenbankprogrammierung 9
P Frage zu Performancetest einer Datenbank Datenbankprogrammierung 3
W Frage zum Umgang mit DB-Daten Datenbankprogrammierung 2
E Nochmal eine Datenbankabfrage Frage :-o (JOIN oder so) Datenbankprogrammierung 4
P frage zu "" bei INSERT STATEMENTS Datenbankprogrammierung 2
K frage zum ausführen eines INSERT statements Datenbankprogrammierung 16
L frage zu mySQL Datenbankprogrammierung 4
C Mal ne Frage an die Experten Datenbankprogrammierung 4
G Frage zum Datenbankdesign Datenbankprogrammierung 5
J DB Verbindung Design Frage Datenbankprogrammierung 5
M Datenbankanbindung in Java : Newbie-Frage Datenbankprogrammierung 2
U Grundsätzliche Frage Datenbankprogrammierung 4
S Frage zu INSERT Datenbankprogrammierung 2
X Wieder mal ne Frage ... Datenbankprogrammierung 15
Beginner22 Zugriff auf Datenbank aus Java über mariadb Datenbankprogrammierung 3
H MariaDB-Zugriff mittels Java SE Datenbankprogrammierung 3
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
M Datenbank vor unerlaubtem Zugriff durch Benutzer schützen Datenbankprogrammierung 3
L Zugriff auf ein Resultset Datenbankprogrammierung 7
R jdbc-Zugriff Nicht erlaubt ? Datenbankprogrammierung 16
K Eclipse: JBoss Hibernate Tool: Kein Zugriff auf Datenbank Datenbankprogrammierung 5
D Gleichzeitiger Zugriff auf der DB Datenbankprogrammierung 11
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
D JavaFX Anwendung zugriff auf MySQL DB. Datenbankprogrammierung 2
F Zugriff auf ein bestimmte Row Datenbankprogrammierung 13
S HSQLDB Zugriff auf Access Datenbank Datenbankprogrammierung 0
K MySQL Datenbank 2facher Zugriff Datenbankprogrammierung 1
M DB-Zugriff funktioniert nach JAR-Erstellung nicht mehr Datenbankprogrammierung 3
P Datenbank Zugriff fehlgeschlagen Datenbankprogrammierung 9
B MySQL JDBC Zugriff auf entfernt Datenbank, fehlende Rechte Datenbankprogrammierung 2
L Zugriff auf lokal gespeicherte mySQL Datenbank Datenbankprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben