# Neuen Kunden anlegen



## Nasim (24. Sep 2009)

Hallo,

also ich habe eine GUI mit NetBeans erstellt und eine Datenbank mit MSSQL verknüpft.

Nun hab ich ein TAB namens "Kundenverwaltung" dort soll man neue Kunden anlegen können.

Man gibt die Angaben vom Neukunden an und klickt dann auf einen Button namens "Neuen Kunden anlegen".

Jetzt soll der Kunde in die Datenbank gespeichert werden nur weiss ich nicht wie das funktioniert ?!

Weiss jemand weiter?

Liebe Grüße

Nasim


----------



## Michael... (24. Sep 2009)

Nasim hat gesagt.:


> Jetzt soll der Kunde in die Datenbank gespeichert werden nur weiss ich nicht wie das funktioniert ?!


Was genau weisst Du nicht, wie das SQL Statement aussehen muss? Wie man mit Java ein SQL Statement an die Datenbank absetzt? ...? Gibts von der GUI und dem Datenbankkontext Code?


----------



## Nasim (24. Sep 2009)

Ich häng dir grad mal das Projekt an.

Also da ich ziemlich wenig Ahnung habe,
weiss ich beides nicht. ^^

Grüße


----------



## Michael... (24. Sep 2009)

Nasim hat gesagt.:


> Also da ich ziemlich wenig Ahnung habe,
> weiss ich beides nicht. ^^


Du weisst aber hoffentlich wie die Tabelle aussieht, in welche die Daten reinmüssen? ;-)


----------



## Nasim (24. Sep 2009)

Sorry habs eben vergessen anzuhängen.
Jetzt aber


----------



## Nasim (24. Sep 2009)

Ja weiss ich, die Datenbankanbindung hab ich ja auch schon hinbekommen,
nur weiss ich nicht was ich machen muss wenn über das Programm ein neuer Kunde angelegt wird, wie ich das realisieren muss.


----------



## Michael... (24. Sep 2009)

Ach wie nett, wiedermal eine automatisch erstellte GUI ;-) Ich habe mir den Code nur im WordPad anschauen können, da machen einem solche automatisch erstellten Oberflächen ganz schön zu schaffen. Ich würde Dir empfehlen die GUI-Klasse aufzuteilen - zumindest für jeden Tab eine eigene Klasse.

Zum speichern der Kundendaten:
Du benutzt ja schon Select - Statements, zum einfügen von Datensätzen benutzt man Insert - Statements: 
	
	
	
	





```
Insert into Kundentabelle (Name, Vorname) values ('Mayer', 'Franz')
```
 Generell würde ich PreparedStatements verwenden. In Java würde das dann so aussehen:

```
PreparedStatement newCustomer = con.prepareStatement("Insert into Kundentabelle (Name, Vorname) values (?, ?)");
newCustomer.setString(1, "Mayer");
newCustomer.setString(2, "Franz");
newCustomer.execute();
```
Das ganze ist ungetestet, für eventuelle Fehler keine Gewähr ;-)


----------



## Nasim (24. Sep 2009)

Ok danke und wo muss ich das reinschreiben in Database.java oder
bei der GUI.java unter Kundenverwaltung beim Button "Neuen Kunden hinzufügen" ?


----------



## Michael... (24. Sep 2009)

Nasim hat gesagt.:


> Ok danke und wo muss ich das reinschreiben ... ?


Das bleibt Dir überlassen. Ich würde dazu eine Methode in die Klasse Database schreiben und diese dann in der actionPerformed mit den Kundendaten als Parameter aufrufen.


----------



## Nasim (24. Sep 2009)

Ok ich hab eine neue Methode in Database erstellt zeigt auch keine Probleme an.

Aber wie soll ich das dann in der actionPerformed mit den Kundendaten machen?

Sorry steh grad i-wie ein bisschen auf dem Schlauch. ^^


----------



## Michael... (24. Sep 2009)

So wie Du es auch in den andere actionPerformed-Methoden machst. Nur musst diesmal anstelle des Suchtexts die Kundeninforrmationen übergeben.


----------



## Nasim (24. Sep 2009)

Ok habs probiert aber weiss nicht genau was da rein gehört und was nicht. 

private void jButtonKundenverwaltungNeuenKundenanlegenActionPerformed(java.awt.event.ActionEvent evt) {                                                                          
        NeuerKunde 
                newCustomer = ("Insert into Kundentabelle (Name, Vorname, Straße, Hausnummer, PLZ, Wohnort, Telefon) values (?, ?)");
            newCustomer.setString(1, "");
            newCustomer.setString(2, "");
            newCustomer.execute();

    }                             

kannst du mir sagen was ich da genau reinschreiben muss?


----------



## André Uhres (25. Sep 2009)

Oliver, ist NeuerKunde ein PreparedStatement??

```
PreparedStatement newCustomer;
try {
    newCustomer = conn.prepareStatement("...");//conn ist eine java.sql.Connection
} catch (SQLException ex) {
    ex.printStackTrace();
}
```
Bei values(..) brauchst du soviele Fragezeichen wie du Werte einfügen willst, in diesem Fall sieben. Die Werte, die du reinschreiben musst, bekommst du aus deinen Textfeldern, etwa so:
String name = jTextFieldKundenverwaltungName.getText();
Mit setString kannst du dann die Werte an die entsprechenden Positionen übergeben (zum Beispiel ist der Name in Position 1):
newCustomer.setString(1, name);
usw.
...


----------



## Nasim (25. Sep 2009)

Danke 
Ok hab ich alles gemacht.
Zeigt auch keine Fehler an aber wenn ich einen neuen Kunden anlegen will, 
also wenn ich auf den Button klick passiert nichts und wenn ich in die Datenbank guck ist auch kein neuer Kunde angelegt worden ?!

Gruß


----------



## Nasim (25. Sep 2009)

In der Database.java :

public void NeuerKunde(String name, String vorname, String straße, String hausnummer, String wohnort, String plz, String telefon){
    PreparedStatement newcustomer;
        try {
            newcustomer = conn.prepareStatement("Insert into Kundentabelle (Name,Vorname,Straße,Hausnummer,Wohnort,PLZ,Telefon) values (?,?,?,?,?,?,?)")
            newcustomer.setString(1, name);
            newcustomer.setString(2, vorname);
            newcustomer.setString(3, straße);
            newcustomer.setString(4, hausnummer);
            newcustomer.setString(5, wohnort);
            newcustomer.setString(6, plz);
            newcustomer.setString(7, telefon);
        } catch (SQLException ex) {
    ex.printStackTrace();
}
    }

In der GUI.java der Button wo den neuen Kunden hinzufügen soll:

private void jButtonKundenverwaltungNeuenKundenanlegenActionPerformed(java.awt.event.ActionEvent evt) {                                                                          
        Database.getDatabase().NeuerKunde(
                    jTextFieldKundenverwaltungName.getText(),
                    jTextFieldKundenverwaltungVorname.getText(),
                    jTextFieldKundenverwaltungStraße.getText(),
                    jTextFieldKundenverwaltungHausnummer.getText(),
                    jTextFieldKundenverwaltungWohnort.getText(),
                    jTextFieldKundenverwaltungPLZ.getText(),
                    jTextFieldKundenverwaltungTelefon.getText());
    }                                                                         


Weiss jemand was ich falsch gemacht habe bzw. etwas vergessen habe?
Bin für jede Hilfe dankbar. 

Liebe Grüße

Nasim


----------



## SlaterB (25. Sep 2009)

zunächst mal hast du vergessen, irgendwelche Probleme zu beschreiben,
funktioniert etwas nicht?
Compilerfehler/ Exception zur Laufzeit/ Fehlverhalten der Anwendung?

als unvollständig könnte man bewerten, dass du bisher nur ein PreparedStatement erstellt hast,
aber auf dessen Ausführung verzichtest:

newCustomer.execute();

und immer KLEIN anfangen, EIN TextFeld, eine Tabelle mit EINEM Attribut,
anfangs am besten nichtmal eine GUI-Anwendung, sondern eher ein einfaches Hello World-Abspeichern-main-Programm

du versinkst in Bergen von Parametern und sonstigen Details ohne den Kern zu erfassen


----------



## Michael... (25. Sep 2009)

Nasim hat gesagt.:


> Weiss jemand was ich falsch gemacht habe bzw. etwas vergessen habe?


Manchmal hilft sich den Code nochmal anschauen, bevor man hier wild Fragen postet ;-)
Du musst das Statement auch ausführen: execute() bzw. executeUpdate();


----------



## Nasim (25. Sep 2009)

Ja ok stimmt hab ich vergessen.

Hab jetzt das Statement ausgeführt und bekomme folgende Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.sql.SQLException: Der Wert NULL kann in die 'KundenNr'-Spalte, 'Bibliothek.dbo.Kunden'-Tabelle nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT.
        at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
        at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)
        at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)
        at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632)
        at net.sourceforge.jtds.jdbc.JtdsStatement.processResults(JtdsStatement.java:584)
        at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQL(JtdsStatement.java:546)
        at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeUpdate(JtdsPreparedStatement.java:506)
        at javaapplication2.Database.NeuerKunde(Database.java:78)
        at javaapplication2.GUI.jButtonKundenverwaltungNeuenKundenanlegenActionPerformed(GUI.java:570)
        at javaapplication2.GUI.access$400(GUI.java:32)
        at javaapplication2.GUI$5.actionPerformed(GUI.java:343)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6216)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5981)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4583)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4413)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2475)
        at java.awt.Component.dispatchEvent(Component.java:4413)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)


----------



## maki (25. Sep 2009)

Was verstehst du denn nicht?

Die Fehlermeldung:

```
Der Wert NULL kann in die 'KundenNr'-Spalte, 'Bibliothek.dbo.Kunden'-Tabelle nicht eingefügt werden. 
Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT.
```
.. ist doch eindeutig.


----------



## Nasim (25. Sep 2009)

Ja ich versteh nich was ich falsch programmiert habe damit der Fehler kommt, weil KundenNr ist der Primärschlüssel also kann man da bei der Datenbank ja auch nicht ankreuzen das auch NULL Werte gültig sind?!


public void NeuerKunde(String name, String vorname, String straße, String hausnummer, String wohnort, String plz, String telefon) throws SQLException{
    PreparedStatement newcustomer = NULL
            newcustomer.executeUpdate();
        try {
            newcustomer = conn.prepareStatement("Insert into Kunden (Name,Vorname,Straße,Hausnummer,Wohnort,PLZ,Telefon) values (?,?,?,?,?,?,?)");//conn ist eine java.sql.Connection
            newcustomer.setString(1, name);
            newcustomer.setString(2, vorname);
            newcustomer.setString(3, straße);
            newcustomer.setString(4, hausnummer);
            newcustomer.setString(5, wohnort);
            newcustomer.setString(6, plz);
            newcustomer.setString(7, telefon);
        } catch (SQLException ex) {
    ex.printStackTrace();
}

    }


----------



## maki (25. Sep 2009)

Das DB Schema ist falsch, der MS SQL Server muss schon wissen dass er den Primärschlüssel selber erstellen muss, ist [c]KundenNr[/c] denn als Identity definiert?


----------



## SlaterB (25. Sep 2009)

du musst offensichtlich einen Wert beim Insert übergeben,
oder die Tabelle anders definieren, auto_increment oder so

Google

vielleicht in jeder DB anders


----------



## Nasim (25. Sep 2009)

Ja der Datentyp von KundenNr ist int.
Weisst du vielleicht was man machen muss damit die DB weiss das sie den Primärschlüssel selbst erstellen muss?


----------



## SlaterB (26. Sep 2009)

ich habe auf google verlinkt und 5 Seiten werden dir 7 Lösungen nennen,
MSSQL kenne ich nicht, wird aber auch dabei sein, notfalls wenn man die Anfrage einschränkt,
Anleitung solltest du auch haben wenn du mit einer bestimmten DB arbeitest,
Foren gibts dazu vielleicht,

naja, viel blah blah, kurz: ich kann dazu nix genaueres sagen 
vielleicht meintest du auch maki


----------



## Nasim (26. Sep 2009)

Ok.
Ja hab aber auch maki gemeint ob er da was weiss ?!


----------



## maki (26. Sep 2009)

Nasim hat gesagt.:


> Ok.
> Ja hab aber auch maki gemeint ob er da was weiss ?!


Hab ich doch schon gesagt, beim MS SQL Server heisst das [c]IDENTITY[/c], natürlich zusätzlich zum [c]int[/c].


----------



## Nasim (27. Sep 2009)

Ja und weisst du wo ich das einstellen muss?


----------

