Hallo,
ich will wie als Überschrift erwähnt, eine zeile in meiner Gui im Table der SQL Datenbank hinzufügen.
Dazu habe ich mir einen button erstellt, der auf knopfdruck eine zeile hinzufügen soll.
Den button habe ich erstellt, Frage ist, ob der Ansatz so richtig ist:
JButton btnadd = new JButton("Zeile hinzufügen"); //Button hinzugefügt
btnadd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
model.addRow(Object[] ); // IST DIESER ANSATZ RICHTIG???
}
});
btnadd.setBounds(197, 180, 129, 23 );
getContentPane().add(btnadd);
Ja prinzipiell spricht nichts dagegen oder? Ich hätt das auch so gemacht, eventuell noch in ein UIThread gepackt damit, die UI nicht einfriert wenn das Insert nicht auf Anhieb klappt.
Also eine zelle in der GUI sprich JTable aktualisiert sich die zeile. Ich schicke mal den Code mit, damit Anfänger, falls sie auf diesen Thread stoßen wissen was ich getan habe.
Code:
JButton btnadd = new JButton("Zeile hinzufügen");
btnadd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
model.addRow(new Object[] {}); // Es wird eine zeile (addRow) hinzugefügt ohne Daten (steht in der "{}")
}
});
btnadd.setBounds(336, 180, 129, 23 );
getContentPane().add(btnadd);
Also eine zelle in der GUI sprich JTable aktualisiert sich die zeile. Ich schicke mal den Code mit, damit Anfänger, falls sie auf diesen Thread stoßen wissen was ich getan habe.
Code:
JButton btnadd = new JButton("Zeile hinzufügen");
btnadd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
model.addRow(new Object[] {}); // Es wird eine zeile (addRow) hinzugefügt ohne Daten (steht in der "{}")
}
});
btnadd.setBounds(336, 180, 129, 23 );
getContentPane().add(btnadd);
Versucht habe ich auch, die Spalte ID, automatsich um 1 zu erhöhen. also von der letzten ID zahl.
Rausgekommen ist aber nur ein Integer wert, den ich auf die nächste ID-zahl gesetzt habe und dann ID++
Java:
finalint[] ID ={6};// In der Datenbank gibt es momentan nur 5 Zeilen (bis Id zahl 5)JButton btnadd =newJButton("Zeile hinzufügen");
btnadd.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvent actionEvent){
model.addRow(newObject[]{ID[0]++});// fügt zeile hinzu und setzt ID auf 6, danach immer ++ (7, 8, 9, ...) // { textField.getText }}// { ID[0]++ } (integer zahl auf 6 gesetzt, addiert dann immer die Zahl um 1)});
btnadd.setBounds(336,180,129,23);getContentPane().add(btnadd);
An der stelle sollte es geworfen werden:
model.addRow(newObject[]{rec.getString("ID"), rec.getString("Firstname"), rec.getString("Lastname"), rec.getString("Sport"), rec.getString("# of years"), rec.getString("Vegetarian")});
java.sql.SQLException:Operation not allowed after ResultSet closed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
at com.mysql.cj.jdbc.result.ResultSetImpl.checkClosed(ResultSetImpl.java:437)
at com.mysql.cj.jdbc.result.ResultSetImpl.findColumn(ResultSetImpl.java:544)
at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:852)
at Test_sql.Test_Daten_hinzufügen$3.actionPerformed(Test_Daten_hinzufügen.java:172)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:270)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6651)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3342)
at java.desktop/java.awt.Component.processEvent(Component.java:6416)
at java.desktop/java.awt.Container.processEvent(Container.java:2263)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5026)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2773)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4858)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
at java.base/java.security.AccessController.doPrivileged(NativeMethod)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
at java.base/java.security.AccessController.doPrivileged(NativeMethod)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
while((rec!=null)&&(rec.next())){
model.addRow(newObject[0]);
model.setValueAt(rec.getString("ID"), row[0],0);// spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getString("Firstname"), row[0],1);// spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getString("Lastname"), row[0],2);// spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getString("Sport"), row[0],3);// spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getFloat("# of years"), row[0],4);// spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getString("vegetarian"), row[0],5);// spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
row[0]++;}
Gibt er normal die GUI aus, und wenn ich es ausführe, kommt es dann zur Fehlermeldung.
Wenn ich den Teil:
Java:
model.addRow(newObject[]{rec.getString("ID"), rec.getString("Firstname"), rec.getString("Lastname"), rec.getString("Sport"), rec.getString("# of years"), rec.getString("Vegetarian")});
darunter einfüge, dasselbe Spiel.
Wenn ich aber den Teil lösche:
CODE=java]while ((rec!=null) && (rec.next())) {
model.addRow(new Object[0]);
model.setValueAt(rec.getString("ID"), row[0], 0); // spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getString("Firstname"), row[0], 1); // spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getString("Lastname"), row[0], 2); // spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getString("Sport"), row[0], 3); // spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getFloat("# of years"), row[0], 4); // spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
model.setValueAt(rec.getString("vegetarian"), row[0], 5); // spalten-name der SQL-Tabelle (muss richtig sein, sonst Fehler)
row[0]++;
}[/CODE]
und ersetze das durch:
Java:
model.addRow(newObject[]{rec.getString("ID"), rec.getString("Firstname"), rec.getString("Lastname"), rec.getString("Sport"), rec.getString("# of years"), rec.getString("Vegetarian")});
Dann wird der "Run" gestartet ohne Fehlermeldung. Die angezeigte GUI mit Table ist jedoch leer. Liegt logischerweise daran, dass der obige Code-Teil, den ich gestrichen habe, die Daten aus der SQL-Datenbank holt.
Klicke ich dann in der leeren table auf dem add-Button, kommt die eine Fehlermeldung.
Mir ist gerade das hier aufgefallen, dass du immer row[0] ansprichst und im Anschluss hoch inkrementierst. Macht das einen Sinn, ich verstehe das nicht. Es ist dann immer row[0] oder?
Wenn cih row[0] ändere z.B. zu 1; 2; 3; ... . Dann kommt es zur fehlermeldung:
java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
Also das Hinzufügen der Row in die GUI das geht auf jede Fall, das ist nur ein Datenbank Zugriffsproblem. Da ich es selten per Hand mache, muss du mal die DB Pros hier mal nachfragen.
Nachtrag: In dem Beispiel von oracle wird das ResultSet nicht geclosed, sondern direkt das Statement, probier mal damit
Die System.out.println-Methode ist nicht für GUI gedacht. Funktioniert nur in der GUI --> Das weißt du sicherlich.
Bevor ich mit GUI angefangen habe, habe ich natürlich mit der Konsolenausgabe angefangen.
Java:
package datenbank;importjava.sql.*;publicclassMeineErsteAbfrage{staticConnection con =null;staticStatement stmt =null;staticResultSet rs =null;publicstaticvoidmain(String args[])throwsInstantiationException,IllegalAccessException,SQLException{try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundException e){
e.printStackTrace();System.exit(1);}try{
con =DriverManager.getConnection
("jdbc:mysql://localhost/film_datenbank","gast","gast");//****** durch pw ersetzen
stmt=con.createStatement();
rs=stmt.executeQuery
("SELECT * FROM dvd_sammlung");while(rs.next()){System.out.println("nr: "+rs.getString(1));System.out.println("name: "+rs.getString(2));System.out.println("nummer: "+rs.getString(3));System.out.println("time (min.): "+rs.getString(4));System.out.println("*************************");// optisches trennen der datensätze}
stmt.close();
con.close();}catch(SQLException e){
e.printStackTrace();return;}}}
Die System.out.println-Methode ist nicht für GUI gedacht. Funktioniert nur in der GUI --> Das weißt du sicherlich.
Bevor ich mit GUI angefangen habe, habe ich natürlich mit der Konsolenausgabe angefangen.
Java:
package datenbank;importjava.sql.*;publicclassMeineErsteAbfrage{staticConnection con =null;staticStatement stmt =null;staticResultSet rs =null;publicstaticvoidmain(String args[])throwsInstantiationException,IllegalAccessException,SQLException{try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundException e){
e.printStackTrace();System.exit(1);}try{
con =DriverManager.getConnection
("jdbc:mysql://localhost/film_datenbank","gast","gast");//****** durch pw ersetzen
stmt=con.createStatement();
rs=stmt.executeQuery
("SELECT * FROM dvd_sammlung");while(rs.next()){System.out.println("nr: "+rs.getString(1));System.out.println("name: "+rs.getString(2));System.out.println("nummer: "+rs.getString(3));System.out.println("time (min.): "+rs.getString(4));System.out.println("*************************");// optisches trennen der datensätze}
stmt.close();
con.close();}catch(SQLException e){
e.printStackTrace();return;}}}
Funktioniert einwandfrei. es wird auch eine neue zeile erstellt, und auch in die SQL-Datenbank wird eine neue Zeile eingefügt. nur ich will das Ganze in einer GUI im JTable machen. Das ist das große Problem.
Musste auch nur eine Insert zeile hinzufügen
Java:
int add = stmt.executeUpdate("INSERT INTO dvd_sammlung VALUES ('3', 'Star Wars: Episode IV - Krieg der Sterne', '3', '125')");System.out.println(add);
Hallo, vielen Dank für das Beispiel.
Habe mal den Code bei mir eingesetzt und die Zugriffsdaten geändert.
Leider bekomme ich eine Fehlermeldung:
java.sql.SQLException: Parameter index out of range (6 > number of parameters, which is 0).
Deinen Code habe ich mir angeguckt, konnte kein Index "6 >" finden.
Meine sql-Datenbank hat aus testgründen nur 5 einträge (Zeilen). Daher dachte ich, Hey... es könnte daran liegen und habe mal ein paar zeilen hinzugefügt.
Folge --> Dasselbe. Parameter index out of range (6 > number of parameters, which is 0)
Daher müsste es irgendwo am Code liegen.
Kannst du mir da nochmal helfen bzw weiß irgendeiner etwas?
Das passt irgendwie nicht recht zusammen, daher ein paar Nachfragen:
1. Du hast den Code genommen und nur die Connection URL und den SELECT angepasst?
2. Du bekommst die Tabelle angezeigt?
3. Beim Klick auf Speichern bekommst Du die Exception?
Du kannst Dir in processUpdate einfach mal dml ausgeben lassen.
Das passt irgendwie nicht recht zusammen, daher ein paar Nachfragen:
1. Du hast den Code genommen und nur die Connection URL und den SELECT angepasst?
2. Du bekommst die Tabelle angezeigt?
3. Beim Klick auf Speichern bekommst Du die Exception?
Ok habe noch etwas herausgefunden, was ich persönlich sehr komisch finde:
Wenn ich das ganze mit der SQL-Tabelle 'personalie' mache, kommt es zum Fehler.
Wenn ich das ganze mit der SQL-Tabelle 'customer' mache, funktioniert es einwandfrei.
Die Beiden Tabellen befinden sich in derselben Datenbank
bei einer 3 Tabelle in einer anderen Datenbank kommt folgende Fehlermeldung:
Java:
java.sql.SQLSyntaxErrorException: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 '(min.), nr.)VALUES (null,null,null,null)' at line 1
Habe versucht ihn richtig hinzubekommen aber ohne Erfolg