# JTextField Eingabe in DB speichern



## Genkin (17. Apr 2019)

Hallo
ich habe folgende DB, siehe Anhang.

Ich habe für die jeweiligen Spalten JTextField's in einem JFrame angelegt. Ich möchte nun alle Eingaben die ich in den Feldern tätige durch einen Speichern Button in meinee Datenbank schrieben. Wie formuliere ich die Insert Into Befehle korrekt ?
Scheitere hier dran :/



```
try
                    {
                         Class.forName("com.mysql.jdbc.Driver").newInstance();
                         String url="jdbc:mysql://"+hostname+":"+port+"/"+dbname;
                         conn=DriverManager.getConnection(url,user,pw);
                         
                         
                        stmt.executeUpdate("INSERT INTO Leistung VALUES('"+txtnDatumBeginn.getText()+"', '"+(new Date((new java.util.Date()).getTime()))+"')");
                        status.setText(txtnDatumBeginn.getText()+" INSERTET INTO DATABASE");
                    }
                    catch(Exception ex)
                    {
                        status.setText("FAILED");
                        ex.printStackTrace();
                    }
                    txtnDatumBeginn.setText("");
                
            
                
                
            }
        });
```

Gruß


----------



## Robat (17. Apr 2019)

So wie du es jetzt hast, solltest du es auf keinen Fall machen (Stichwort SQL-Injection)
Hier mal ein Insert Beispiel mit PreparedStatements. Diese "verhindern" SQL-Injection


----------



## Genkin (17. Apr 2019)

Hab es jetzt mal angepasst, aber bis auf die Strings wird alles rot markiert

```
preparedStatement.setDate(1, txtnDatumBeginn.getText());
            preparedStatement.setDate(2, txtnDatumBeginn.getText());
            preparedStatement.setInt(3, Mo.getText());
            preparedStatement.setInt(4, Di.getText());
            preparedStatement.setInt(5, Mi.getText());
            preparedStatement.setInt(6, Do.getText());
            preparedStatement.setInt(7, Fr.getText());
            preparedStatement.setInt(8, Sa.getText());
            preparedStatement.setInt(9, So.getText());
            preparedStatement.setInt(10, Ft.getText());
            preparedStatement.setString(11, txtnZug.getText());
            preparedStatement.setInt(12, txtnLinie.getText());
            preparedStatement.setDate(13, txtnAbfahrt.getText());
            preparedStatement.setDate(14, txtnAnkunft.getText());
            preparedStatement.setString(15, txtnStart.getText());
            preparedStatement.setString(16, txtnEnde.getText());
            preparedStatement.setString(17, txtnStations.getText());
```

Wie muss ich das umändern?


----------



## Robat (17. Apr 2019)

In dem du die Strings in die passenden Datentypen umwandelst


----------



## Genkin (18. Apr 2019)

Habe umgewandelt, aber irgendwas hab ich falsch, bekomme folgende Fehlermeldung:


Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Time



```
private static void insertRecordIntoTable() throws SQLException, ParseException {

        Connection dbConnection = null;
        PreparedStatement preparedStatement = null;

        String insertTableSQL = "INSERT INTO Leistung"
                + "(Datum, DatumEnde, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag, Feiertage, Zug, Linie, Abfahrt, Ankunft, Von, Nach, Stationen) VALUES"
                + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

        try {
            
            
            String text1 = Mo.getText();
            int mo = Integer.parseInt(text1);
            String text2 = Di.getText();
            int di = Integer.parseInt(text2);
            String text3 = Mi.getText();
            int mi = Integer.parseInt(text3);
            String text4 = Do.getText();
            int DO = Integer.parseInt(text4);
            String text5 = Fr.getText();
            int fr = Integer.parseInt(text5);
            String text6 = Sa.getText();
            int sa = Integer.parseInt(text6);
            String text7 = So.getText();
            int so = Integer.parseInt(text7);
            String text8 = Ft.getText();
            int ft = Integer.parseInt(text8);
            
            
            SimpleDateFormat sdf1 = new SimpleDateFormat("dd-MM-yyyy");
            
            String startDate = txtnDatumBeginn.getText();
            String endDate = txtnDatumEnde.getText();
            
            
            java.util.Date date1 = sdf1.parse(startDate);
            java.sql.Date sqlStartDate = new java.sql.Date(date1.getTime());  
            
            java.util.Date date2 = sdf1.parse(endDate);
            java.sql.Date sqlEndDate = new java.sql.Date(date2.getTime());
            

            DateFormat dateFormat = new SimpleDateFormat("hh:mm:ss");
            Time time1 = (Time) dateFormat.parse(txtnAbfahrt.getText());
            Time time2 = (Time) dateFormat.parse(txtnAnkunft.getText());
            
            String text9 = txtnLinie.getText();
            int Linie = Integer.parseInt(text9);
            
            
            
            dbConnection = getDBConnection();
            preparedStatement = dbConnection.prepareStatement(insertTableSQL);

            preparedStatement.setDate(1, (java.sql.Date) sqlStartDate);
            preparedStatement.setDate(2, (java.sql.Date) sqlEndDate);
            preparedStatement.setInt(3, mo);
            preparedStatement.setInt(4, di);
            preparedStatement.setInt(5, mi);
            preparedStatement.setInt(6, DO);
            preparedStatement.setInt(7, fr);
            preparedStatement.setInt(8, sa);
            preparedStatement.setInt(9, so);
            preparedStatement.setInt(10, ft);
            preparedStatement.setString(11, txtnZug.getText());
            preparedStatement.setInt(12, Linie);
            preparedStatement.setTime(13, time1);
            preparedStatement.setTime(14, time2);
            preparedStatement.setString(15, txtnStart.getText());
            preparedStatement.setString(16, txtnEnde.getText());
            preparedStatement.setString(17, txtnStations.getText());

            // execute insert SQL stetement
            preparedStatement.executeUpdate();

            System.out.println("Record is inserted into DBUSER table!");

        } catch (SQLException e) {

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

        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }

            if (dbConnection != null) {
                dbConnection.close();
            }

        }

    }
```


----------



## Robat (18. Apr 2019)

Die parse Methode wirft ein Date zurück. Du kannst ein Date nicht einfach zu einem Time Objekt casten. Mach lieber sowas `Time time = new Time(date.getTime())`


----------



## Genkin (18. Apr 2019)

Wenn ich das so mache sagt Eclipse mir dass die Methode getTime undefiniert ist für den Typ JTextField


----------



## Robat (18. Apr 2019)

Sollte funktionieren.

```
DateFormat dateFormat = new SimpleDateFormat("hh:mm:ss");
Time time1 = new Time(dateFormat.parse(txtnAbfahrt.getText()).getTime());
```


----------



## Genkin (18. Apr 2019)

Danke, glaub jetzt klappt es. Bekomme aber noch eine andere Fehlermeldung:

Parameter index out of range (16 > number of parameters, which is 15).

Das bedeutet?


----------



## Genkin (18. Apr 2019)

Die Meldung ist jetzt weg aber jetzt sagt er mir dass die Tabelle nicht in der engine existiert?? 
Verbinde mit myphpadmin und die Tabelle ist vorhanden mit allen Spalten


----------



## Robat (18. Apr 2019)

Das bedeutet, dass du in deinem SQL Query ein "?" vergessen hast.

```
"INSERT INTO Leistung"
                + "(Datum, DatumEnde, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag, Feiertage, Zug, Linie, Abfahrt, Ankunft, Von, Nach, Stationen) VALUES"
                + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
```


----------



## Genkin (18. Apr 2019)

Robat hat gesagt.:


> Das bedeutet, dass du in deinem SQL Query ein "?" vergessen hast.
> 
> ```
> "INSERT INTO Leistung"
> ...




Ja daran lag es ! Habe es umgeändert.
Aber jetzt halt die Meldung dass die Tabelle nicht existiert
Table '***** . ******' doesn't exist in engine


----------



## Genkin (18. Apr 2019)

Hat sich erledigt. Mit ner neuen Tabelle ging es


----------



## Genkin (19. Apr 2019)

Hallo nochmal!
Ich habe noch ein String[] blabla, was ich in die DB schreiben will. 

preparedStatement.set???(18, blabla);

Wie muss das set lauten bzw. wie muss ich hier umgehen? 
Muss ich das String[] in String parsen? 
Das String[] enthält mehrere Zeilen, wie kriege ich die in die DB geschrieben?


----------



## Robat (19. Apr 2019)

Was steht denn in dem String[] drin - also was für Daten. Eventuell würde sich hierfür eine neue Tabelle lohen.
Erzähl mal etwas darüber.


----------



## Genkin (19. Apr 2019)

Die Daten werden über eine Klasse "Editor" in eine JTextArea eingegeben, per Zeilenumbruch gesplittet und in das String[] gespeichert. Es ist quasi eine Auflistung von Stationen.

Was für einen Typ müsste ich eigentlich Stationen in der der Datenbank geben?


----------



## Robat (19. Apr 2019)

Genkin hat gesagt.:


> Was für einen Typ müsste ich eigentlich Stationen in der der Datenbank geben?


Eine eigene Tabelle in der Datenbank


----------



## Genkin (19. Apr 2019)

Geht das nicht in einer? Weil muss die gesamte Tabelle später in Tabellenform aufrufen und es sollte alles drin sein


----------



## Robat (19. Apr 2019)

Es geht alles. Ist aber nicht Sinn und Zweck einer Datenbank. 
Und mit der Darstellung hat das nichts zu tun


----------



## Genkin (19. Apr 2019)

Okey, ich erstelle eine zweite Tabelle. Ich muss dann aber noch Leistung mit reinnehmen.

Wie schreibe ich ein Array dynamischer Größe in eine Datenbank?


----------



## Robat (19. Apr 2019)

Was möchtest du denn machen?


----------



## Genkin (19. Apr 2019)

Ich will einfach nur eine Auflistung aller Stationen in der DB haben

Die Stationen gebe ich in einer separaten Klasse in ein JTextArea ein und splite sie per Zeilenumbruch.


----------



## Robat (19. Apr 2019)

Die Station ist ja eine separate Tabelle. Jeder Datensatz hat dort eine eindeutige ID (zb) 
Ich verstehe das Problem gerade nicht


----------



## mihe7 (19. Apr 2019)

Was ist den eigentlich der Zweck des Programms?


----------



## Genkin (19. Apr 2019)

Also...

Ich habe eine Klasse Editor mit Textfeldern die ich mit Eingaben fülle.
Ein Textfeld davon ist eine JTextArea.
Dort gebe ich per Zeilenumbruch eine Auflistung von Haltestationen an und splite sie nach jedem Zeilenumbruch.

Ich habe eine Datenbank mit dazugehörigen Tabellen. In die will ich jetzt alles reinschreiben.


```
preparedStatement.setArray(18, listeStationen);
```

Habe jetzt statt String -> Array geschrieben und in der Klasse Editor von String[] -> in Array.
Jetzt meckert er in der Klasse Editor:


```
listeStationen = txtnStations.getText().split("\n");
```

mit "Can not convert from String[] to Array"

listeStationen ist mit static Array listeStationen deklariert


----------



## mihe7 (19. Apr 2019)

Genkin hat gesagt.:


> mit "Can not convert from String[] to Array"


Richtig, String[] ist zwar ein Array aber kein Objekt der Klasse java.sql.Array.

Nochmal kurz die Frage: was ist der Zweck des ganzen Programms? Ich frage, weil mir Dein Modell etwas seltsam vorkommt.


----------



## Genkin (19. Apr 2019)

Es geht um ein Verwaltungsprogramm für Bahnfahrten.


----------



## mihe7 (19. Apr 2019)

Genkin hat gesagt.:


> Es geht um ein Verwaltungsprogramm für Bahnfahrten.


Ein wenig genauer bitte. Soll das eine Fahrplanauskunft werden oder ein Aushang, ein Kursbuch oder ... ?


----------



## Robat (19. Apr 2019)

Und bitte lass die technischen Dinge weg. Hier ist es erstmal irrelevant wie die View aussieht / wie die Daten eingelesen werden. 
Wichtig ist was du erreichen willst, was gespeichert werden muss,...


----------



## Genkin (19. Apr 2019)

Nein. Ein Admin soll die Möglichkeit haben einen neuen Fahrplan zu erstellen. Die Daten dafür sollen per Hand eingegeben werden (später käme noch Import/Export von csv/xml Dateien hinzu).

Eingegeben werden sollen 
Leistung (quasi ID)
Beginn- und Enddatum
Wie oft der Zug an welchen Tagen fährt
Abfahrt- / Ankunftszeit
Zug
Linie
Start
Ziel

und eben alle Stationen die angefahren werden.
Ich bekomme alles in die DB geschrieben und kann sie auch abrufen, nur eben die angefahrenen Stationen nicht.


----------



## mihe7 (19. Apr 2019)

Was heißt "wie oft der Zug an welchen Tagen fährt"? Wenn die Abfahrts- bzw. Ankunftszeit angegeben ist, kann er ja nicht mehrfach zu dieser Zeit fahren. Andersrum gesagt: ergibt sich die Anzahl nicht aus den Zeiten?

Unabhängig davon: es gibt eine Haltestellentabelle und es gibt eine Leistungstabelle. Die beiden dürften in einer n:m-Relation zueinander stehen. Du brauchst also noch eine Tabelle, die eine Haltestelle einer Leistung zuordnet.


----------



## Genkin (19. Apr 2019)

Die Gestaltung der Tabellen ist noch nicht final und um die geht es vorerst nicht.

Meine Frage ist (wie schon so oft gesagt) einfach nur wie ich eine Auflistung von Stationen in eine DB Tabelle kriege.


EDIT: Bin grade am überlegen ob ich nicht einfach nen normalen String erstelle, dort alle Stationen kommasepariert reinpacke, und beim DB auslesen dann einfach nach jedem Komma splitte a


----------



## mihe7 (19. Apr 2019)

Das habe ich Dir gerade geschrieben 

Moment, ich schreibe mal kurz ein Beispiel.


----------



## mihe7 (19. Apr 2019)

```
Leistung
--------

(Tage habe ich wg. besserer Darstellung weggelassen)

ID  | Linie | Zug | Abfahrt | Ankunft | Start | Ziel
123 | S1    | 321 | 13:00   | 14:00   | Ort1  | Ort2


Haltestellen
------------
ID  | Name 
 1  | Ort 1, Hauptbahnhof
 2  | Ort 2
 3  | Ort 3
 4  | Ort 5
...
100 | Ort 2, Hauptbahnhof


Zuordnung
---------

Leistung | Haltestelle 
     123 | 1
     123 | 2
     123 | 10
     123 | 22
     123 | 80
     123 | 100
```

Die Zuordnung gibt für jede Leistung an, welche Haltestellen angefahren werden. Natürlich bräuchtest Du noch ein Ordnungskriterium, das können einfach Zahlen oder z. B. Uhrzeiten sein.


----------



## mihe7 (19. Apr 2019)

Jetzt ist mir gerade eingefallen, dass im Bahnbereich ja in der Regel mit DS100 Codes gearbeitet wird. Die könnten dann als Key der Haltestelle dienen. Wenn Du keine Details zur Hst brauchst, könntest Du die Haltestellentabelle weglassen und die Zuordnungstabelle würde genügen.


----------



## Genkin (19. Apr 2019)

Danke dir erstmal. Schaue mir dein Beispiel an wenn ich die DB verfeinere!

Jetzt mal wieder zurück zu den lästigen Stationen.
Wie würde der Code aussehen, wenn ich die Stationen aus der DB einlesen, kommasepariert splitten und ausgeben will?


EDIT: Und gibt es eine Möglichkeit, Datum von und bis in eine Tabelle zu schreiben, sodass auch die Daten dazwischen geschrieben werden?

Also:
DatumVon: 01.01.2000
DatumBis: 31.12.2000

das soll geschrieben werden:
01.01.2000
02.01.2000
03.01.2000
...
31.12.2000


----------



## mihe7 (20. Apr 2019)

Genkin hat gesagt.:


> Jetzt mal wieder zurück zu den lästigen Stationen.



Irgendwie schreiben wir aneinander vorbei: wir schreiben doch die ganze Zeit von den Stationen 



Genkin hat gesagt.:


> wenn ich die Stationen aus der DB einlesen, kommasepariert splitten und ausgeben will?


Du speicherst die Stationen nicht in einem Feld sondern so, wie ich es oben dargestellt habe: zu jeder Leistung gibt es eine Liste (=Datensätze einer Tabelle) mit Stationen. Das wäre zumindest die normalisierte Form.

Um dann die Stationen zu einer Leistung abzurufen, brauchst Du lediglich einen SELECT.

Wenn Du die Daten unbedingt nicht normalisiert speichern willst, dann kannst Du im einfachsten Fall den String per ResultSet#getString() aus der DB laden und per String#split() wieder aufteilen. Das funktioniert natürlich nur, wenn sichergestellt ist, dass das Trennzeichen in den Stationen nicht auftreten kann. Ansonsten müsstest Du größere Geschütze auffahren.



Genkin hat gesagt.:


> Und gibt es eine Möglichkeit, Datum von und bis in eine Tabelle zu schreiben, sodass auch die Daten dazwischen geschrieben werden?


Du iterierst in einer Schleife über die Tage im Zeitraum und erzeugst für jeden Tag jeweils einen Satz.


```
LocalDate start = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate end = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
    preparedStatement.setDate(1, java.sql.Date.valueOf(date));
    preparedStatement.setDate(2, ...);
    // ...
    preparedStatement.addBatch();
}
preparedStatement.executeBatch();
```


----------



## Genkin (20. Apr 2019)

Das heißt, ich soll 365 Sätze schreiben? 
toInstant wird




mihe7 hat gesagt.:


> Du iterierst in einer Schleife über die Tage im Zeitraum und erzeugst für jeden Tag jeweils einen Satz.
> 
> [/code]


----------



## mihe7 (20. Apr 2019)

Genkin hat gesagt.:


> Das heißt, ich soll 365 Sätze schreiben?


Wenn Du 365 Tage einzeln haben willst: ja.


----------



## Genkin (20. Apr 2019)

In MySql soll es einen generate_series Befehl geben um einen Zeitraum Von - Bis zu schreiben. Kann ich diesen Befehl nicht in meinen Code verpacken?
Alles einzeln abzutippen ist ja total mühsam


----------



## mihe7 (20. Apr 2019)

Genkin hat gesagt.:


> Das heißt, ich soll 365 Sätze schreiben?





Genkin hat gesagt.:


> Alles einzeln abzutippen ist ja total mühsam


Evtl. habe ich Dich vorhin falsch verstanden: Du sollst nicht 365 Sätze tippen sondern es werden 365 Sätze in die DB geschrieben. Automatisch in einer Schleife (s. Beispiel oben).


----------



## Genkin (20. Apr 2019)

mihe7 hat gesagt.:


> ```
> LocalDate start = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
> LocalDate end = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
> 
> ...




Alles gut
Also, nur mal um zu gucken ob ich das jetzt richtig verstanden hab..
In der ersten Zeile der Schleife werden mehrere Zeilen für ein Datumsintervall geschrieben?

Und ab der 2. Zeile kommen dann meine restlichen Values rein, sprich, Leistung, Zug etc. ?

hab deinen Code mal eingefügt, alles importiert, aber jetzt meckert er wegen toInstant(). Wie muss ich das ganze ergänzen bzw. aufbauen?


----------



## mihe7 (20. Apr 2019)

In dem Beispiel wird davon ausgegangen, dass startDate und endDate vom Typ java.util.Date sind. Zum Rest später, muss kurz weg.


----------



## mihe7 (20. Apr 2019)

Genkin hat gesagt.:


> In der ersten Zeile der Schleife werden mehrere Zeilen für ein Datumsintervall geschrieben?
> 
> Und ab der 2. Zeile kommen dann meine restlichen Values rein, sprich, Leistung, Zug etc. ?


Ja. In der ersten Zeile innerhalb des Schleifenrumpfs wird der erste Parameter auf das jeweils aktuelle Datum gesetzt. In den restlichen Zeilen werden die anderen Parameter der Leistung gesetzt und mit addBatch werden die gesetzten Parameter zwischengespeichert. Nach der Schleife wird das Statement für alle zwischengespeicherten Parameter in einem Rutsch durchgeführt.


----------



## Genkin (20. Apr 2019)

Okey danke dir
Bei toInstant sagt er mir "the method is undefined for the type string"



EDIT: Liegt der Fehler hier irgendwo?


```
SimpleDateFormat sdf1 = new SimpleDateFormat("dd.MM.yyyy");
            
            String startDate = txtnDatumBeginn.getText();
            String endDate = txtnDatumEnde.getText();
            
            
            java.util.Date date1 = sdf1.parse(startDate);
            java.sql.Date sqlStartDate = new java.sql.Date(date1.getTime());  
            
            java.util.Date date2 = sdf1.parse(endDate);
            java.sql.Date sqlEndDate = new java.sql.Date(date2.getTime());
            

            DateFormat dateFormat = new SimpleDateFormat("hh:mm");
            Time time1 = new Time(dateFormat.parse(txtnAbfahrt.getText()).getTime());
            Time time2 = new Time(dateFormat.parse(txtnAnkunft.getText()).getTime());
```


----------



## mihe7 (20. Apr 2019)

Für den Code müsstest Du 

```
LocalDate start = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate end = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
```
verwenden.


----------



## Genkin (20. Apr 2019)

Das hat zwar gepasst, aber es wird nur eine Zeile geschrieben. Es wird quasi nur das Startdatum reingepackt und es wird nicht weiter bis zum Enddatum gerechnet


----------



## mihe7 (20. Apr 2019)

Zeig mal Deinen Code.


----------



## Genkin (21. Apr 2019)

```
package Database;

import java.sql.DriverManager;
//import java.sql.Array;
import java.sql.Connection;
//import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Time;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.ZoneId;
import java.text.ParseException;


public class DBWriter extends Editor {
    


    private static final String DB_DRIVER = "com.mysql.jdbc.Driver";
    private static final String DB_CONNECTION = "jdbc:mysql://localhost:3306/*******";
    private static final String DB_USER = "******;
    private static final String DB_PASSWORD = "******";

    public static void writeDB() throws ParseException {

        
        
        
        try {

            insertRecordIntoTable();

        } catch (SQLException e) {

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

        }

    }

    private static void insertRecordIntoTable() throws SQLException, ParseException {

        Connection dbConnection = null;
        PreparedStatement preparedStatement = null;

        String insertTableSQL = "INSERT INTO leistungen"
                + "(Tage, Leistung, DatumBeginn, DatumEnde, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag, Feiertage, Zug, Linie, Abfahrt, Ankunft, Von, Nach, Stationen) VALUES"
                + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        


        try {
            
            

            String text1 = Mo.getText();
            int mo = Integer.parseInt(text1);
            String text2 = Di.getText();
            int di = Integer.parseInt(text2);
            String text3 = Mi.getText();
            int mi = Integer.parseInt(text3);
            String text4 = Do.getText();
            int DO = Integer.parseInt(text4);
            String text5 = Fr.getText();
            int fr = Integer.parseInt(text5);
            String text6 = Sa.getText();
            int sa = Integer.parseInt(text6);
            String text7 = So.getText();
            int so = Integer.parseInt(text7);
            String text8 = Ft.getText();
            int ft = Integer.parseInt(text8);
            
            
            SimpleDateFormat sdf1 = new SimpleDateFormat("dd.MM.yyyy");
            
            String startDate = txtnDatumBeginn.getText();
            String endDate = txtnDatumEnde.getText();
            
            
            java.util.Date date1 = sdf1.parse(startDate);
            java.sql.Date sqlStartDate = new java.sql.Date(date1.getTime());  
            
            java.util.Date date2 = sdf1.parse(endDate);
            java.sql.Date sqlEndDate = new java.sql.Date(date2.getTime());
            

            DateFormat dateFormat = new SimpleDateFormat("hh:mm");
            Time time1 = new Time(dateFormat.parse(txtnAbfahrt.getText()).getTime());
            Time time2 = new Time(dateFormat.parse(txtnAnkunft.getText()).getTime());
            

            
            String text9 = txtnLeistung.getText();
            int Leistung = Integer.parseInt(text9);
            
            
            
            dbConnection = getDBConnection();
            preparedStatement = dbConnection.prepareStatement(insertTableSQL);
            

            


            LocalDate start = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
            LocalDate end = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();



            for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
                preparedStatement.setDate(1, java.sql.Date.valueOf(date));
                preparedStatement.setInt(2, Leistung);
                preparedStatement.setDate(3, (java.sql.Date) sqlStartDate);
                preparedStatement.setDate(4, (java.sql.Date) sqlEndDate);
                preparedStatement.setInt(5, mo);
                preparedStatement.setInt(6, di);
                preparedStatement.setInt(7, mi);
                preparedStatement.setInt(8, DO);
                preparedStatement.setInt(9, fr);
                preparedStatement.setInt(10, sa);
                preparedStatement.setInt(11, so);
                preparedStatement.setInt(12, ft);
                preparedStatement.setString(13, txtnZug.getText());
                preparedStatement.setString(14, txtnLinie.getText());
                preparedStatement.setTime(15, time1);
                preparedStatement.setTime(16, time2);
                preparedStatement.setString(17, txtnStart.getText());
                preparedStatement.setString(18, txtnEnde.getText()); 
                preparedStatement.setString(19, STATIONEN);
                preparedStatement.addBatch();
            }
            preparedStatement.executeBatch();


            


            System.out.println("Record is inserted into DBUSER table!");

        } catch (SQLException e) {

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

        } finally {

            if (preparedStatement != null) {
                preparedStatement.close();
            }

            if (dbConnection != null) {
                dbConnection.close();
            }

        }

    }
    private static Connection getDBConnection() {

        Connection dbConnection = null;

        try {

            Class.forName(DB_DRIVER);

        } catch (ClassNotFoundException e) {

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

        }

        try {

            dbConnection = DriverManager.getConnection(
                    DB_CONNECTION, DB_USER,DB_PASSWORD);
            return dbConnection;

        } catch (SQLException e) {

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

        }

        return dbConnection;

    }

    private static java.sql.Timestamp getCurrentTimeStamp() {

        java.util.Date today = new java.util.Date();
        return new java.sql.Timestamp(today.getTime());

    }

}
```


----------



## mihe7 (21. Apr 2019)

Und wenn Du in txtnDatumBeginn den "01.01.2019" und in txtnDatumEnde den "31.12.2019" eingibst, welcher Satz wird dann geschrieben?


----------



## Genkin (21. Apr 2019)

01.01.2019...


----------



## mihe7 (21. Apr 2019)

Kannst Du mal unmittelbar nach

```
for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
```
noch

```
System.out.println(date);
```
einbauen und schauen, was ausgegeben wird?


----------



## Genkin (21. Apr 2019)

```
2019-01-01
2019-01-02
2019-01-03
2019-01-04
2019-01-05
2019-01-06
2019-01-07
2019-01-08
2019-01-09
2019-01-10
2019-01-11
2019-01-12
2019-01-13
2019-01-14
2019-01-15
2019-01-16
2019-01-17
2019-01-18
2019-01-19
2019-01-20
2019-01-21
2019-01-22
2019-01-23
2019-01-24
2019-01-25
2019-01-26
2019-01-27
2019-01-28
2019-01-29
2019-01-30
2019-01-31
2019-02-01
2019-02-02
2019-02-03
2019-02-04
2019-02-05
2019-02-06
2019-02-07
2019-02-08
2019-02-09
2019-02-10
2019-02-11
2019-02-12
2019-02-13
2019-02-14
2019-02-15
2019-02-16
2019-02-17
2019-02-18
2019-02-19
2019-02-20
2019-02-21
2019-02-22
2019-02-23
2019-02-24
2019-02-25
2019-02-26
2019-02-27
2019-02-28
2019-03-01
2019-03-02
2019-03-03
2019-03-04
2019-03-05
2019-03-06
2019-03-07
2019-03-08
2019-03-09
2019-03-10
2019-03-11
2019-03-12
2019-03-13
2019-03-14
2019-03-15
2019-03-16
2019-03-17
2019-03-18
2019-03-19
2019-03-20
2019-03-21
2019-03-22
2019-03-23
2019-03-24
2019-03-25
2019-03-26
2019-03-27
2019-03-28
2019-03-29
2019-03-30
2019-03-31
2019-04-01
2019-04-02
2019-04-03
2019-04-04
2019-04-05
2019-04-06
2019-04-07
2019-04-08
2019-04-09
2019-04-10
2019-04-11
2019-04-12
2019-04-13
2019-04-14
2019-04-15
2019-04-16
2019-04-17
2019-04-18
2019-04-19
2019-04-20
2019-04-21
2019-04-22
2019-04-23
2019-04-24
2019-04-25
2019-04-26
2019-04-27
2019-04-28
2019-04-29
2019-04-30
2019-05-01
2019-05-02
2019-05-03
2019-05-04
2019-05-05
2019-05-06
2019-05-07
2019-05-08
2019-05-09
2019-05-10
2019-05-11
2019-05-12
2019-05-13
2019-05-14
2019-05-15
2019-05-16
2019-05-17
2019-05-18
2019-05-19
2019-05-20
2019-05-21
2019-05-22
2019-05-23
2019-05-24
2019-05-25
2019-05-26
2019-05-27
2019-05-28
2019-05-29
2019-05-30
2019-05-31
2019-06-01
2019-06-02
2019-06-03
2019-06-04
2019-06-05
2019-06-06
2019-06-07
2019-06-08
2019-06-09
2019-06-10
2019-06-11
2019-06-12
2019-06-13
2019-06-14
2019-06-15
2019-06-16
2019-06-17
2019-06-18
2019-06-19
2019-06-20
2019-06-21
2019-06-22
2019-06-23
2019-06-24
2019-06-25
2019-06-26
2019-06-27
2019-06-28
2019-06-29
2019-06-30
2019-07-01
2019-07-02
2019-07-03
2019-07-04
2019-07-05
2019-07-06
2019-07-07
2019-07-08
2019-07-09
2019-07-10
2019-07-11
2019-07-12
2019-07-13
2019-07-14
2019-07-15
2019-07-16
2019-07-17
2019-07-18
2019-07-19
2019-07-20
2019-07-21
2019-07-22
2019-07-23
2019-07-24
2019-07-25
2019-07-26
2019-07-27
2019-07-28
2019-07-29
2019-07-30
2019-07-31
2019-08-01
2019-08-02
2019-08-03
2019-08-04
2019-08-05
2019-08-06
2019-08-07
2019-08-08
2019-08-09
2019-08-10
2019-08-11
2019-08-12
2019-08-13
2019-08-14
2019-08-15
2019-08-16
2019-08-17
2019-08-18
2019-08-19
2019-08-20
2019-08-21
2019-08-22
2019-08-23
2019-08-24
2019-08-25
2019-08-26
2019-08-27
2019-08-28
2019-08-29
2019-08-30
2019-08-31
2019-09-01
2019-09-02
2019-09-03
2019-09-04
2019-09-05
2019-09-06
2019-09-07
2019-09-08
2019-09-09
2019-09-10
2019-09-11
2019-09-12
2019-09-13
2019-09-14
2019-09-15
2019-09-16
2019-09-17
2019-09-18
2019-09-19
2019-09-20
2019-09-21
2019-09-22
2019-09-23
2019-09-24
2019-09-25
2019-09-26
2019-09-27
2019-09-28
2019-09-29
2019-09-30
2019-10-01
2019-10-02
2019-10-03
2019-10-04
2019-10-05
2019-10-06
2019-10-07
2019-10-08
2019-10-09
2019-10-10
2019-10-11
2019-10-12
2019-10-13
2019-10-14
2019-10-15
2019-10-16
2019-10-17
2019-10-18
2019-10-19
2019-10-20
2019-10-21
2019-10-22
2019-10-23
2019-10-24
2019-10-25
2019-10-26
2019-10-27
2019-10-28
2019-10-29
2019-10-30
2019-10-31
2019-11-01
2019-11-02
2019-11-03
2019-11-04
2019-11-05
2019-11-06
2019-11-07
2019-11-08
2019-11-09
2019-11-10
2019-11-11
2019-11-12
2019-11-13
2019-11-14
2019-11-15
2019-11-16
2019-11-17
2019-11-18
2019-11-19
2019-11-20
2019-11-21
2019-11-22
2019-11-23
2019-11-24
2019-11-25
2019-11-26
2019-11-27
2019-11-28
2019-11-29
2019-11-30
2019-12-01
2019-12-02
2019-12-03
2019-12-04
2019-12-05
2019-12-06
2019-12-07
2019-12-08
2019-12-09
2019-12-10
2019-12-11
2019-12-12
2019-12-13
2019-12-14
2019-12-15
2019-12-16
2019-12-17
2019-12-18
2019-12-19
2019-12-20
2019-12-21
2019-12-22
2019-12-23
2019-12-24
2019-12-25
2019-12-26
2019-12-27
2019-12-28
2019-12-29
2019-12-30
2019-12-31
```


----------



## mihe7 (21. Apr 2019)

Was ich seltsam finde, ist dass keine Exception geworfen wird.

Wie sieht denn das DDL-Statement für die Tabelle aus? (CREATE TABLE ...)


----------



## Genkin (21. Apr 2019)

meinst du das hier ?

```
String insertTableSQL = "INSERT INTO leistungen"
                + "(Tage, Leistung, DatumBeginn, DatumEnde, Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag, Sonntag, Feiertage, Zug, Linie, Abfahrt, Ankunft, Von, Nach, Stationen) VALUES"
                + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
```

Die Tabelle ist schon lange erstellt
Vielleicht läuft das einfach über mysql nicht.. oder per phpmyadmin geht es nicht.


----------



## mihe7 (21. Apr 2019)

Genkin hat gesagt.:


> Die Tabelle ist schon lange erstellt
> Vielleicht läuft das einfach über mysql nicht..


Doch, natürlich funktioniert das mit mysql.

Was hat phpmyadmin damit zu tun?



Genkin hat gesagt.:


> meinst du das hier ?


Nein, das wäre das DML-Statement, das DDL-Statement fängt mit CREATE TABLE an. Es geht darum, wie die Tabelle definiert ist, welche Spalten und -typen und welches Keys es gibt.


----------



## Genkin (21. Apr 2019)

Ich wusste nichtmal, was DDL ist... aber daran lag es..

Es lag daran, dass ich anscheinend einen Primary Key erstellt hatte. Hab den mal wieder gelöscht und jetzt funktioniert es! 
Vielen Dank 

Ich habe das gebraucht, weil ich diverse Qualitätsberichte fürs ganze Jahr erzeugen muss (in PDF oder HTML Format)

Das wäre die nächste Aufgabe, aber du hast schon echt viel getan!


----------



## mihe7 (21. Apr 2019)

Genkin hat gesagt.:


> Es lag daran, dass ich anscheinend einen Primary Key erstellt hatte. Hab den mal wieder gelöscht und jetzt funktioniert es!


Du solltest auch einen PK haben. Die Frage ist nur, wie der aussieht. Im einfachsten Fall führst Du eine auto_increment ID-Spalte ein.


Genkin hat gesagt.:


> Ich wusste nichtmal, was DDL ist...


DDL = Data Definition Language, DML = Data Manipulation Language  



Genkin hat gesagt.:


> Ich habe das gebraucht, weil ich diverse Qualitätsberichte fürs ganze Jahr erzeugen muss (in PDF oder HTML Format)


Wenn es nur darum geht, kannst Du z. B. auch einfach zwei Spalten für einen Zeitraum in die Tabelle aufnehmen, und dann nur einen Satz für die Leistung mit entsprechendem Zeitraum ("01.01.2019", "31.12.2019") schreiben. Dann lassen sich per Abfrage die betreffenden Leistungen heraussuchen.

Beispiel: gib mir alle Leistungen, die in den Zeitraum 01.12.2019 bis 31.03.2020 fallen.

`SELECT * FROM leistung WHERE bis_datum >= '2019-12-01' and von_datum <= '2020-03-31';`


----------



## Genkin (21. Apr 2019)

Problem ist, dass ich auch Meldungen (Baustelle, Ausfall etc.) setzen muss für bestimmte Tage.

Schau mal, habe diesen Code gefunden, der eine PDF mit iText erstellt. Wie kann ich jetzt (oder morgen) die Tabelle aus der DB hier rein übergeben? 


```
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;

public class PdfSchreiben {

    public static final String PDF = "/Users/*******/Desktop/document.pdf";

    public void createPdf(String filename) throws DocumentException,
            IOException {
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document,
                new FileOutputStream(filename));
        document.open();

        PdfContentByte cb = writer.getDirectContent();
        BaseFont bf = BaseFont.createFont();
     //   setImage(cb, "img/memory.png", 40);
        cb.beginText();
        cb.setFontAndSize(bf, 12);
        cb.moveText(20, 105);
        cb.showText("Falsches Üben von Xylophonmusik quält jeden größeren Zwerg.");
        cb.moveText(120, -16);
        cb.setCharacterSpacing(2);
        cb.setWordSpacing(12);
        cb.newlineShowText("Erst recht auch jeden kleineren.");
        cb.endText();

        document.close();

    }

    private void setImage(PdfContentByte cb, String imgPath, float scalePercent)
            throws MalformedURLException, IOException, DocumentException {
        Image img = Image.getInstance(imgPath);
        img.scalePercent(scalePercent);
        img.setAbsolutePosition(cb.getXTLM(), cb.getYTLM());
        cb.addImage(img);
    }

    private void printMeasures(){
        System.out.println("A4-Ma\u00DFe: " + PageSize.A4.getWidth() + "pt x "
                + PageSize.A4.getHeight() + "pt - "
                + (PageSize.A4.getWidth() * 0.3527) + "mm x "
                + (PageSize.A4.getHeight() * 0.3527) + "mm");
    }

    public static void main(String[] args) throws DocumentException,
            IOException {
        PdfSchreiben ps = new PdfSchreiben();
        ps.createPdf(PDF);
        ps.printMeasures();
        System.out.println("done");
    }
}
```


----------



## Genkin (21. Apr 2019)

Ich hatte dir grade eine schöne Privatmessage verfasst, aber leider kann ich sie dir nicht schicken


----------



## mihe7 (21. Apr 2019)

Da gibt es natürlich viele Wege. Hier mal einer, der einfach ein ResultSet ausgibt:

```
import java.io.*;
import java.sql.*;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

public class Test {

    public static void createPdf(String filename, ResultSet rs) {
        try {
            Document doc = new Document();
            PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(filename));
            doc.open();
            doc.add(newTable(rs));
            doc.close();
        } catch (IOException | DocumentException ex) {
            ex.printStackTrace();
        }
    }

    private static PdfPTable newTable(ResultSet rs) throws IOException {
        try {
            ResultSetMetaData md = rs.getMetaData();
            int cols = md.getColumnCount();
            PdfPTable table = new PdfPTable(cols);
            addTableHeader(table, md);
            addTableBody(table, md, rs);
            return table;
        } catch (SQLException ex) {
            throw new IOException(ex);
        }
    }

    private static void addTableHeader(PdfPTable table, ResultSetMetaData md) 
            throws SQLException {
        for (int i = 0, n = md.getColumnCount(); i < n; i++) {
            table.addCell(newHeaderCell(md.getColumnLabel(i+1)));
        }
    }

    private static void addTableBody(PdfPTable table, ResultSetMetaData md, ResultSet rs) 
            throws SQLException {
        while (rs.next()) {
            for (int i = 0, n = md.getColumnCount(); i < n; i++) {
                table.addCell(newCell(rs.getObject(i+1)));
            }
        }
    }

    private static PdfPCell newHeaderCell(String value) {
        return new PdfPCell(new Phrase(value));
    }

    private static PdfPCell newCell(Object value) {
        return new PdfPCell(new Phrase(value == null ? "" : value.toString()));
    }

    public static void main(String[] args) throws Exception {
        String sql = "SELECT Zug, Linie, Abfahrt, Ankunft, Von, Nach, Stationen FROM leistungen";
        // ggf. noch WHERE-Klausel mit Parametern
        // dann müssen diese unten gesetzt werden (aktuell auskommentiert)

        try(Connection conn = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/test", "mihe7", "test");
                PreparedStatement stmt = conn.prepareStatement(sql)) {
            // Parameter setzen:
            // stmt.setXXX(column, param);
            try (ResultSet rs = stmt.executeQuery()) {
                createPdf("test.pdf", rs);
            }
        }
    }
}
```


----------



## kneitzel (21. Apr 2019)

Ähnlich, die Schleife setzt nur die Parameter des Prepared Statement, der Aufruf ist außerhalb der Schleife. Da ist dann doch klar, dass nur ein Wert geschrieben wird.

Ich würde in der Schleife des PreparedStatement aufbauen und ausführen. Evtl der Übersicht halber in einer eigenen Funktion.  Dank Connection Pooling kann sogar das holen der Connection da mit drin sein.


----------



## kneitzel (21. Apr 2019)

kneitzel hat gesagt.:


> Ähnlich, die Schleife setzt nur die Parameter des Prepared Statement, der Aufruf ist außerhalb der Schleife. Da ist dann doch klar, dass nur ein Wert geschrieben wird.
> 
> Ich würde in der Schleife des PreparedStatement aufbauen und ausführen. Evtl der Übersicht halber in einer eigenen Funktion.  Dank Connection Pooling kann sogar das holen der Connection da mit drin sein.


Ach vergiss es, baust ja ein batch auf ... falsch geschaut.


----------



## Genkin (21. Apr 2019)

Komplett EDIT:


```
try {
           
            VON = von.getText();
            BIS = bis.getText();
           
            SimpleDateFormat sdf1 = new SimpleDateFormat("dd.MM.yyyy");
           
            java.util.Date date1 = sdf1.parse(VON);
            java.sql.Date sqlTag1 = new java.sql.Date(date1.getTime());
           
           
            java.util.Date date2 = sdf1.parse(VON);
            java.sql.Date sqlTag2 = new java.sql.Date(date2.getTime());
           
           
            String insertTableSQL = "UPDATE leistungen"
                    + " SET Baustelle = true,"
                    + " Grund = '" + individuell.getText()
                    + "', Beginnt = '" + (java.sql.Date)sqlTag1
                    + "', Endet = '" + (java.sql.Date)sqlTag2
                    + "', ZwischenA = '" + a.getText()
                    + "', BisB = '" + b.getText()
                    + "' WHERE Tage "
                    + " BETWEEN '" + (java.sql.Date)sqlTag1
                    + "' AND '" + (java.sql.Date)sqlTag2 + "'";
           

            dbConnection = getDBConnection();
            preparedStatement = dbConnection.prepareStatement(insertTableSQL);

            preparedStatement.executeUpdate();
```

schreibt nur in eine Zeile und nicht zwischen sqlTag1 und sqlTagl2. Was hab ich heir falsch?


----------



## mihe7 (21. Apr 2019)

Schreib das mal so um, dass Du Parameter verwendest (also mit ? und setXXX(...)) wie beim Insert.


----------



## Genkin (21. Apr 2019)

Hab ich, geht nicht. Eclipse sagt ich hätte einen error in meiner SQL syntax. Verstehe aber nicht wo.


```
String insertTableSQL = "UPDATE leistungen"
                    + "SET (Baustelle, Grund, Beginnt, Endet, ZwischenA, BisB) VALUES"
                    + "(?,?,?,?,?,?)"
                    + "WHERE Tage BETWEEN'" + (java.sql.Date)sqlTag1 + "' AND '" + (java.sql.Date)sqlTag2 + "'";
            
            LocalDate start = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
            LocalDate end = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
            
            for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
            

            dbConnection = getDBConnection();
            preparedStatement = dbConnection.prepareStatement(insertTableSQL);
            preparedStatement.setBoolean(1, true);
            preparedStatement.setString(2, individuell.getText());
            preparedStatement.setDate(3, (java.sql.Date)sqlTag1);
            preparedStatement.setDate(4, (java.sql.Date)sqlTag2);
            preparedStatement.setString(5, a.getText());
            preparedStatement.setString(6, b.getText());
            preparedStatement.addBatch();
        }
        preparedStatement.executeBatch();

       
          //  preparedStatement.executeUpdate();

            System.out.println("Record is inserted into DBUSER table!");
```


----------



## mihe7 (21. Apr 2019)

Nein, keine Schleife. Nur:


```
String sql = "UPDATE leistungen"
                    + "SET Baustelle=?, Grund=?, Beginnt=?, Endet=?, ZwischenA=?, BisB=? "
                    + "WHERE Tage BETWEEN ? AND ?";
            dbConnection = getDBConnection();
            try(preparedStatement = dbConnection.prepareStatement(sql)) {
                preparedStatement.setBoolean(1, true);
                preparedStatement.setString(2, individuell.getText());
                preparedStatement.setString(2, individuell.getText());
                preparedStatement.setDate(3, (java.sql.Date)sqlTag1);
                preparedStatement.setDate(4, (java.sql.Date)sqlTag2);
                preparedStatement.setString(5, a.getText());
                preparedStatement.setString(6, b.getText());
                // es folgen die zwei BETWEEN-Parameter
                preparedStatement.setDate(7, (java.sql.Date)sqlTag1);
                preparedStatement.setDate(8, (java.sql.Date)sqlTag2);
                preparedStatement.executeUpdate();
            }
```


----------



## Genkin (21. Apr 2019)

```
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '=1, Grund='ljkö', Beginnt='2019-01-03', Endet='2019-01-06', ZwischenA='ghrtjukz' at line 1
```


----------



## mihe7 (21. Apr 2019)

Schreib mal statt `String sql = "UPDATE leistungen"` bitte `String sql = "UPDATE leistungen "` also mit Leerzeichen vor dem Anführungszeichen am Ende, das habe ich vergessen.


----------

