# HSQLDB und Variablen



## xquadrat (13. Dez 2005)

Hallo,
Ich habe folgendes Problem:

ich möchte aus einer anderen Klasse die funktion insertKonto aufrufen und hier die dort abgefragte Kontonummer übergeben. Schreibe ich in die Zeile

```
sqlQuery = "INSERT INTO konto (KTO_NR) VALUES(Kontonummer)";
```

bekomme ich die Fehlermeldung KONTONUMMER not found. Trage ich hier einfach ein paar Ziffern ein, funktioniert es wie gewollt... wie kann ich der Datenbank klarmachen, dass ich hier den Wert der Variablen will?


```
package javadb;

import java.sql.*;
import java.util.Date;

public class KontoDB{
    public static void main(String [] args) throws SQLException, ClassNotFoundException{
        Class.forName("org.hsqldb.jdbcDriver");
        Connection con = DriverManager.getConnection(
                "jdbc:hsqldb:file:myDBs/userDB;shutdown=true","sa","");
        
        Statement stmt = con.createStatement();
        PreparedStatement prepStmt = null;
        ResultSet rs = null;

        
        con.close();
        System.out.println("TEST");
    }  // end of main
//  -----------------------------------------------------------------------
//  Buchung in Tabelle buchungen einfügen
//  ----------------------------------------------------------------------
    public void insertBuchung(String sqlQuery, Statement stmt, double Betrag, Date Datum, int Gegenkonto)
    throws SQLException, ClassNotFoundException {
        
         sqlQuery = "INSERT INTO buchungen (K_ID, Betrag, Datum, Gegenkonto) " +
                "VALUES(1, Betrag, Datum, Gegenkonto)";
         stmt.executeQuery(sqlQuery);
    }
    
//  -----------------------------------------------------------------------
//  Konto in Tabelle konten einfügen
//  ----------------------------------------------------------------------
    public void insertKonto(String sqlQuery, Statement stmt, int Kontonummer)
    throws SQLException, ClassNotFoundException {
        sqlQuery = "INSERT INTO konto (KTO_NR) VALUES(Kontonummer)";
        stmt.executeQuery(sqlQuery);
    }
//  -----------------------------------------------------------------------
//  Inhalt der Kontotabelle ausgeben
//  ----------------------------------------------------------------------
    public void printKonto(String sqlQuery, Statement stmt, ResultSet rs)
    throws SQLException, ClassNotFoundException {
                 sqlQuery = "SELECT * FROM konto";
        rs = stmt.executeQuery(sqlQuery);
        System.out.println("\n == ALLE VORHANDENEN BUCHUNGEN === \n");
        int counter = 1;
        while(rs.next()){
            System.out.println(counter++ + ". Datensatz:\n");
            int id = rs.getInt("K_Id");
            System.out.print("\t [K_ID -->" + id + "]");
            int ktoNr = rs.getInt("KTO_NR");
            System.out.print("\t [KTO_NR -->" + ktoNr + "]\n\n");
        }
    }
//  -----------------------------------------------------------------------
//  Tabellen konto und buchungen anlegen
//  -----------------------------------------------------------------------
    
    public void createTables(String sqlQuery, Statement stmt)  
        throws SQLException, ClassNotFoundException{

        sqlQuery = "CREATE TABLE konto (K_ID INTEGER IDENTITY, KTO_NR INTEGER, PRIMARY KEY(K_ID));";
        stmt.executeUpdate(sqlQuery);
        sqlQuery = "CREATE TABLE buchungen(B_ID INTEGER IDENTITY, K_ID INTEGER, Betrag DOUBLE, Datum DATE, Gegenkonto INTEGER, PRIMARY KEY(B_ID), FOREIGN KEY(K_ID) REFERENCES konto(K_ID));";
        stmt.executeUpdate(sqlQuery);
    }
    
} // end of KontoDB
```


----------



## Roar (13. Dez 2005)

:?
vielleicht nochmal nachlesen wie man strings benutzt? 
"ich hab " + 27 + " zentimeter"


----------



## xquadrat (13. Dez 2005)

???
Ich will dem Ding nicht den Namen Kontonummer zuweisen, sondern den Wert der int Variablen Kontonummer


----------



## Roar (13. Dez 2005)

xquadrat hat gesagt.:
			
		

> ???
> Ich will dem Ding nicht den Namen Kontonummer zuweisen, sondern den Wert der int Variablen Kontonummer


ja, aber ersteres tust du mit deinem code: 
sqlQuery = "INSERT INTO konto (KTO_NR) VALUES(Kontonummer)"; 
und letzteres mit meinem (mehr oder weniger  )


----------



## bummerland (13. Dez 2005)

```
sqlQuery = "INSERT INTO konto (KTO_NR) VALUES(" + Kontonummer + ")";
```


----------



## xquadrat (13. Dez 2005)

cool, danke, das hat schon mal geklappt,
jetzt habe ich ein weiteres problem, ich habe ja meine Klasse KontoDB,
jetzt habe ich eine weitere Klasse KontoZugriff von der aus ich die Funktionen der Klasse KontoDB aufrufen will.
er scheint die funktion auch aufzurufen, allerding wird das Statement wohl nie ausgeführt, denn wenn ich die zur Kontrolle die printKonto Funktion aufrufe, dann erscheint der Datensatz nicht.



```
package javadb;
import java.sql.*;

public class KontoZugriff extends KontoDB {
    public static void main(String[] args) throws SQLException, ClassNotFoundException{
        
        Class.forName("org.hsqldb.jdbcDriver");
        Connection con = DriverManager.getConnection(
                "jdbc:hsqldb:file:myDBs/userDB;shutdown=true","sa","");
                
        ResultSet rs = null;
        Statement stmt = con.createStatement();
        
        KontoDB kontoDB = new KontoDB();
        String sqlQuery = null;
        int year = 1980;
        int month = 8;
        int day = 21;
        Date Datum = new Date(year, month,day);
        
        double Betrag = 22.80;
        int Gegenkonto = 987654;
        int Kontonummer = 64332626;
        
        kontoDB.insertKonto(sqlQuery, stmt, Kontonummer);
        stmt.executeQuery(sqlQuery);
        kontoDB.printKonto(sqlQuery, stmt, rs);
    }

    public KontoZugriff() {
    }
    
}
```


----------



## xquadrat (13. Dez 2005)

Ich habe jetzt gefunden warum das nicht funktioniert, weil ja bei jedem Start von KontoZugriff eine neue instanz von KontoDB angelegt wird. Wie kann ich das umgehen?


----------



## Timmah (15. Dez 2005)

Du Verbindest dich einmal mit der DB. Dann steht die Connection. Das con.close(); packst du in eine extra Methode trenneVerbindung(); das Verbinden in aufbauenVerbindung();.

Dann machst du dir eine getConnection();, mit der du die Verbindung abfragen kannst. 

Also allgemein die einzelnen Sachen etwas strukturieren, so dass du nicht immer "Verbindung aufbauen - Verbindung abbauen" machen musst (Beim INSERT nicht immer Verbindungen aufbauen,abbauen, sondern diese Methode einzeln machen).
 Dann funktioniert das auch, und du brauchst du eine Instanz von deiner KontoDB.


----------

