# preparedStatement (MySQL - JDBC)



## wirstu23 (19. Mrz 2009)

Guten Morgen!
Ich habe da einige Probleme mit der folgenden Aufgabe:

_"Schreiben Sie zur Benchmark-Datenbank aus der Aufgabe 2) eine ausführlich
kommentierte Prozedur oder Methode (bspw. in C, C++ oder Java), die zu einer
vorgegebenen Kontonummer als Eingabeparameter alle Buchungen zu diesem Konto
ausdruckt. In der geforderten Übersicht interessieren die Kontonummer (ACCID), der Name des Kontobesitzers (NAME), der Buchungsbetrag (DELTA) und der
Buchungskommentar (CMMNT).

Der Verbindungsaufbau zur Datenbank sollte außerhalb der Prozedur oder Methode
erfolgen (aber im Rahmenprogramm mit angegeben werden!), sodass die verfügbare Verbindung innerhalb der Prozedur oder Methode mehrfach verwendet werden kann. Erläutern Sie Ihr Programm in wenigen Sätzen!"_

Im Prinzip ist das Ganze auch kein Problem. Bis ich zu den Preparedstatements komme. Ich bekomme, egal was ich mache, die Fehlermeldung:

_You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where accounts.accid=1' at line 1_
(Für die accid habe ich bei dem Versuch 1 angegeben. Der SQL-Befehl funktioniert im DBMS und Werte werden auch gefunden. Von daher kann es daran nicht liegen)

Weiss echt nicht mehr was ich machen soll, weil ich es wirklich exakt so gemacht habe wie es bei mir im Skript steht.
Der Programmteil in dem die Relationen erstellt werden ist ok. Die Relation wird mit nem anderen Programm gefüllt, aber da läuft alles einwandtfrei. Deshalb habe ich das erstmal weg gelassen. 
Das Preparedstatement ist in der main. Hoffe es ist von der Übersichtlichkeit noch ertragbar.


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.*;

public class aufgabe3 {
    
    static Connection conn;
    static boolean verbunden = false;
    static boolean created = false;
    static int accid;
    

    static boolean connect()
    {
        System.out.println("Treiber werden geladen ...");
        try
        {
            Class.forName("com.mysql.jdbc.Driver");    
            
        } catch (ClassNotFoundException e){
            System.out.println(e.getMessage());
        }
        System.out.println("Treiber geladen!");
    
        try
        {
            conn = DriverManager.getConnection("jdbc:mysql://localhost/pascal", "root", "fenster");
            
        }catch (SQLException e){
            System.out.println(e.getMessage());            
        }
        return verbunden = true;
        
    }
    
    static boolean createRelation()
    {
        try
        {
            System.out.println("Relationen werden angelegt ...");
            
            Statement stmt = conn.createStatement();
            stmt.execute("drop table if  exists history,accounts,tellers,branches");
            
            stmt.executeUpdate("create table branches"
                    + "( branchid int not null, "
                    + "branchname char(20) not null, "
                    + "balance int not null, " + "address char(72) not null, "
                    + "primary key (branchid))");
            
            stmt.executeUpdate("create table accounts( "
                    + "accid   int not null,"
                    + "name char(20) not null,"
                    + "balance int not null,"
                    + "branchid int not null,"
                    + "address char(68) not null,"
                    + "primary key (accid),"
                    + "foreign key (branchid) references branches(branchid) );");

            // erstellt tellers
            stmt.executeUpdate("create table tellers"
                    + "(tellerid int not null,"
                    + "tellername char(20) not null,"
                    + "balance int not null,branchid int not null,"
                    + "address char(68) not null,"
                    + "primary key (tellerid),"
                    + "foreign key (branchid) references branches(branchid) );");

            // erstellt history
            stmt.executeUpdate("create table history"
                    + "( accid int not null,tellerid int not null,"
                    + "delta int not null," + "branchid int not null,"
                    + "accbalance int not null," + "cmmnt char(30) not null,"
                    + "foreign key (accid) references accounts(accid),"
                    + "foreign key (tellerid) references tellers(tellerid),"
                    + "foreign key (branchid)references branches(branchid) );");
            
            System.out.println("Relationen sind angelegt!");
            conn.close();
            
        }catch(SQLException e){
        }
        
        return created = true;
    }
    
    public static void main (String args[])
    throws IOException
    {
        
        BufferedReader din = new BufferedReader( 
                  new InputStreamReader(System.in));
        
        System.out.println("Möchten Sie die Relationen neu anlegen?");
        
        int menu = 0;
        do
        {
            menu = Integer.parseInt(din.readLine());
        }while(menu<1 | menu>2);
        
        if(menu == 1)
        {
            connect();
            createRelation();
        }
        
        System.out.println("Bitte Kundennummer angeben: ");
        accid = Integer.parseInt(din.readLine());
        connect();
        try{
            conn.setAutoCommit(false);
            
            PreparedStatement stt = conn.prepareStatement(
            "select accounts.accid, history.delta, history.cmmnt" +
            "from history, accounts " +
            "where accounts.accid=?");
            
                stt.setInt(1,accid);
                ResultSet rs = stt.executeQuery();
                
            while (rs.next())
            {
                System.out.println(rs.getInt("accid") + "\t" +
                rs.getInt("delta") + "\t\t" + rs.getString("cmmnt"));
            }
            rs.close();
            conn.commit();
            
            conn.close();
            System.out.println("Disconnected!");
            
        }catch(SQLException f)
        {        
            System.out.println(f.getMessage());
        }
    }
}
```
Über nen kleinen Tipp würd ich mich freuen. 

Hier mal ein Ausschnitt aus dem Schema


----------



## SlaterB (19. Mrz 2009)

ich weiß nicht wirklich weiter, aber zwei generelle Tipps:
- probiere das ganze erstmal separat mit einer ganz neuen einfachen Tabelle test mit nur einer int-Spalte
- frage zunächst ohne where alle Datensätze ab, schon gar nicht joins in der Anfrage usw

edit: ach halt, alles klar,
du kannst in where nicht tabellenname.attribut schreiben, das ist doch kein SQL,

schreibe
FROM accounts a
where a.id = 1

und nun kann ich auch erwähnen:
wenn du einen join über accounts und history machst, dann brauchst du besser eine join-Bedingung, etwa
where h.id = a.id


----------



## Vayu (19. Mrz 2009)

ich würde mal probieren ein Leerzeichen mehr zu verwenden 

[HIGHLIGHT="Java"]PreparedStatement stt = conn.prepareStatement(
            "select accounts.accid, history.delta, history.cmmnt<LEERZEICHEN>" +
            "from history, accounts " +
            "where accounts.accid=?");
[/HIGHLIGHT]


----------



## wirstu23 (19. Mrz 2009)

Ok ... mir is auch aufgefallen, dass die Anfrage so nicht ganz richtig gewesen wäre.


```
PreparedStatement stt = conn.prepareStatement(
            "select accid, delta, cmmnt" +
            "from history" +
            "where accid=? ");
```
Der Fehler ist danach wieder aufgetreten ... habe dann mal verschiedene andere Anfragen ausprobiert und bin auf den Fehler gestoßen: JDBC mag die Verknüpfung der Strings nicht.


```
PreparedStatement stt = conn.prepareStatement(
            "select accid, delta, cmmnt from history where accid=?");
```
Danke für die Hilfe :>

[EDIT] Ok ... dann warn die Leerzeichen ^^


----------



## maki (19. Mrz 2009)

>> JDBC mag die Verknüpfung der Strings nicht.

Falsch 

Der fehler ist jetzt offentsichtlich:

```
"select accid, delta, cmmnt" +
            "from history" +
            "where accid=? "
```
Das ergibt einen String mit folgendem Inhalt:

```
select accid, delta, cmmntfrom historywhere accid=? "
```
Merkst du etwas? 

Nachtrag: Hast du ja selbst schon rausgefunden


----------



## Vayu (19. Mrz 2009)

das war das erste wo ich nachgeschaut hab  weil da fall ich auch immer wieder mit auf die Nase ^^


----------

