Datenbankanbindung mit einem JButton

Ci

Aktives Mitglied
Hallo,

ich versuch gerade verzweifelt einen Variablenwert in eine Datenbank zu laden!
Die Datenbankverbindung soll erst dann erfolgen, wenn ich einen Button angeklickt hab. In diesem Fall der Button pruefung abschliessen

Wenn ich die Datenbankverbindung in meine main() packe, dann funktioniert das laden des Variablenwertes. Wie gesagt, ich möchte die Verbindung zur Datenbank erst dann herstellen, wenn ich auf meinen Button geklickt hab.

hier mein Versuch bisher, leider mit Fehlermeldungen:

Java:
package getATR;

import java.awt.event.ActionEvent;

public class GUI_ATR extends JFrame{
	
	// Meine Button 
	public static JButton daten_pruefen = new JButton("<html>Daten<br>pruefen</html>");
	public static JButton pruefung_abschließen = new JButton("<html>Pruefung<br>abschliessen</html>");
	
	public static JLabel lblKartennr = new JLabel("* Karten-Nr.:");
	public static JFormattedTextField txtFKartennr = new JFormattedTextField();
	
	// das hier ist neu:
	public static String blabla = null;
	
	public static String b = "346";
	public static String c = "456";

	public Connection con;
	
	public static JTextArea textArea = new JTextArea();
	private final JScrollPane scrollPane = new JScrollPane();
	
	static File f;
	static String path_f;
	static int returnVal;
	
	
	public GUI_ATR(){
		
		setTitle("TEST");
		
		this.setVisible(true);
		setSize(1010, 532);
		setLocation(150, 100);
		setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
		JPanel panel = new JPanel();
		getContentPane().add(panel);
		panel.setLayout(null);
		
		// Daten prüfen Button
		
		panel.add(daten_pruefen);
		daten_pruefen.setSize(70, 35);
		daten_pruefen.setLocation(5, 5);
	
		// Prüfung abschließen Button
		
		panel.add(pruefung_abschließen);
		pruefung_abschließen.setSize(95, 35);
		pruefung_abschließen.setLocation(350, 5);

		// Karten-Nr.:
		lblKartennr.setBounds(458, 259, 81, 14);
		panel.add(lblKartennr);
		lblKartennr.setVisible(false);
		
		txtFKartennr.setBounds(579, 256, 100, 20);
		panel.add(txtFKartennr);
		txtFKartennr.setDocument(new FixedSizeDocument(6));
		txtFKartennr.setVisible(false);
		
		// Text Area
		
		scrollPane.setBounds(5, 45, 440, 455);
		panel.add(scrollPane);
		scrollPane.setViewportView(textArea);
		
		addWindowListener(new meinWindowListener());

		
	/////////////////////////////////////////////////
	// Daten prüfen Button
	/////////////////////////////////////////////////
	
	
	daten_pruefen.addActionListener(new ActionListener(){
	public void actionPerformed(ActionEvent e) {
		open_terminal();
		karteninhalt_auslesen.init_log_command_list();
			gui_leeren();
			open_terminal();
			if (Connect_Terminal.isTerminal_present() == true) {
				open_card();
				if (Connect_Card.isCard_present() == true) {
					
					lblKartennr.setVisible(true);
					txtFKartennr.setVisible(true);
					String inhalt = txtFKartennr.getText();
					System.out.println(inhalt);
					init_osVersion();
					try {
						
						//Karteninhalt ausgeben
						karteninhalt_auslesen.ausgabe_auswahl();
					
					} catch (CardException e1) {
						e1.printStackTrace();
					}
					
				} else {
					GUI_ATR.textArea.append("Keine Karte vorhanden");
					
				}
			} else {
				GUI_ATR.textArea.append("Chipkartenleser ist nicht eingesteckt");
			}
		}
	});
		
		/////////////////////////////////////////////////
		// Prüfung abschließen Button
		/////////////////////////////////////////////////
		
		pruefung_abschließen.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e) {
		
			
			open_terminal();

			blabla = txtFKartennr.getText();
			System.out.println("Hier der Inhalt: " +blabla );
			gui_leeren();
			
			GUI_ATR.textArea.append("...Formular geleert!");
			
//------------------- ab hier Datenbanverbindung herstellen ------------------//
			
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			
			Connection con = DriverManager
					.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)}" 
								+ ";DBQ=C:/Dokumente und Einstellungen/dsv/Desktop/" 
								+ "Datenbank_Test.mdb");
			
			
			try {
				
				con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
                       } catch (SQLException sqle) {
                            sqle.printStackTrace();
                       }
                  con.close();
			}
		
		
		});
	}
	
	public void gui_leeren(){
		
		// um mein Textfeld zu leeren
		textArea.setText("");
		lblKartennr.setVisible(false);					
		txtFKartennr.setVisible(false);
		txtFKartennr.setText("");
	}
	
	public static void init_osVersion() {
		Inhalt_ATR.init_ATR();
		Inhalt_ATR.convert_atr();
		Inhalt_ATR.init_all_Maps();
		Inhalt_ATR.set_all_Variables();
	}
	

	public static void open_terminal() {
		Connect_Terminal.create_factory();
		try {
			Connect_Terminal.create_terminals(0);
		} catch (CardException e2) {
			textArea.append(e2.toString());
		} catch (Exception e2) {
			textArea.append(e2.toString());
		}
	}

	public static void open_card() {
		try {
			Connect_Card.newCard();
		} catch (CardException e1) {
			GUI_ATR.textArea.append(e1.toString());
		}
	}

	public static void File_chooser() throws IOException {
		JFileChooser fc = new JFileChooser();
		fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
		returnVal = fc.showOpenDialog(null);

		if (returnVal == JFileChooser.APPROVE_OPTION) {
			setF(fc.getSelectedFile());
			setPath_f(f.getPath());
		}
	}

	public static File getF() {
		return f;
	}

	public static void setF(File f) {
		GUI_ATR.f = f;
	}

	public static String getPath_f() {
		return path_f;
	}

	public static void setPath_f(String path_f) {
		GUI_ATR.path_f = path_f;
	}


	public class meinWindowListener extends WindowAdapter {
		public void windowClosing(WindowEvent a) {
			System.exit(0);
		}
	}
}

Java:
package getATR;

import java.awt.EventQueue;

public class MainKlasse {

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
			try {
				GUI_ATR frame = new GUI_ATR();
				frame.setVisible(true);

				
                    	} catch (Exception e) {
                    			e.printStackTrace();
                    	}
			
				}
	
			});
				
		}
}

hoff mir kann jmd. helfen

gruß
 
Zuletzt bearbeitet:
hier meine Fehlermeldungen:

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems:
Unhandled exception type ClassNotFoundException
Unhandled exception type SQLException
Unhandled exception type SQLException

at getATR.GUI_ATR.<init>(GUI_ATR.java:148)
at getATR.MainKlasse$1.run(MainKlasse.java:11)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
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)

klar kann man das alles nicht testen, aber ich möchte ja nur wissen, ob ich die Datenbankanbindung an der richtigen Stelle auch ordentlich aufrufe! Wenn ich nämlich den Code in meine main packe, funktioniert das auch alles schön. Wie gesagt, ich brauche das ganze auf dem Button!

das parallel laufende Thema sollte quasi das Selbe sein, nur wurde mir da aufmerksam gemacht, dass ich einige Codezeilen ünnötig im Code hab. Und so ist das eig. Thema untergegangen 🙁

gruß
 
Zuletzt bearbeitet:
eine Exception muss mit try/catch abgefangen oder mit throws weitergeworfen werden,
throws ist bei einem Listener nicht erlaubt, try/catch hast du überall im Programm nur in Zeile 148 bzw. in der Methode dort ist nirgendwo ein catch zu finden,
zudem ab Zeile 130 alles in das try

wenn du dafür ein Forum brauchst dann sehen wir dich ja hier ein Leben lang 😉
(Anstachelung bisschen mehr nachzudenken, dafür ist der Kopf über deinen Hals, nicht nur zum Forum-Beiträge formulieren)

> Wenn ich nämlich den Code in meine main packe, funktioniert das auch alles schön.

sowas im Zweifel ruhig auch posten als Vergleich
 
Zuletzt bearbeitet von einem Moderator:
hier im Abschnitt ist doch mein try/catch:

Java:
pruefung_abschließen.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e) {
        
            
            open_terminal();
 
            blabla = txtFKartennr.getText();
            System.out.println("Hier der Inhalt: " +blabla );
            gui_leeren();
            
            GUI_ATR.textArea.append("...Formular geleert!");
            
//------------------- ab hier Datenbanverbindung herstellen ------------------//
            
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            
            Connection con = DriverManager
                    .getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)}" 
                                + ";DBQ=C:/Dokumente und Einstellungen/dsv/Desktop/" 
                                + "Datenbank_Test.mdb");
            
            
            try {
                
                con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
                       } catch (SQLException sqle) {
                            sqle.printStackTrace();
                       }
                  con.close();
            }
        
        
        });
    }

oder was meinst du genau?

na ja, wenn ich selbst draufkommen würde, dann würd ich ja nicht fragen. Du fragst doch die Frau auch nicht nach ihrem Alter, wenn du genau weißt, wie alt sie ist 🙂

...zum Thema nochmal. Wieso klappt das ganze in der main, aber nicht mit dem Button?
 
ich kenne deine main-Methode nicht und in deinem geposteten Code kannst du per Browser-Suche oder Texteditor nach 'catch' suchen, es ist einfach nicht vorhanden,
ein try alleine reicht nicht
 
hier meine Main wo es auch funktionierts:

Java:
package getATR;

import java.awt.EventQueue;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class MainKlasse {

	public static karteninhalt_auslesen m = new karteninhalt_auslesen();
	public static String blabla = m.getAbc();

	public static String b = "111";
	public static String c = "456";
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
			try {
				GUI_ATR frame = new GUI_ATR();
				frame.setVisible(true);
					
				Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

				Connection con = DriverManager
						.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)}" 
									+ ";DBQ=C:/Dokumente und Einstellungen/xyz/Desktop/" 
									+ "Datenbank_Test.mdb");
					
					try { 
				           con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
				          
				       } catch (SQLException sqle) {
				            sqle.printStackTrace();
				       }
				       con.close();
					
			} catch (Exception e) {
					e.printStackTrace();
			}
			}
		});
	}	
}


und hier der Abschnitt mit try/catch:

Java:
try {
                
                con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
                       }catch (SQLException sqle) {
                            sqle.printStackTrace();
                       }
                  con.close();
            }
 
ok, da bin ich nun schuld, das catch ist doch vorhanden,
ich kann nur ausweichend über deine üble Einrückung lästern 😉
(sieht aus als gehört } in Zeile 8 zu { in Zeile 1)

wie schon gesagt gehören aber noch mehr Befehle in das try-catch hinein,
im Zweifel immer ganze Methodeninhalte, also von Beginn bis zum Ende des Listeners,
danach kannst du ja Schritt für Schritt ausprobieren was davor/ danach raus kann
 
Zuletzt bearbeitet von einem Moderator:
einverstanden. Werd mal probieren, aber wieso klappts in meiner main?

ist es, weil ich da meine Datenbankanbindung innerhalb eines zusätlichen try/catch gepackt hab?
 
habs jetzt mal einfach so ausprobiert:

Java:
pruefung_abschließen.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e) {
			open_terminal();
			try {
			blabla = txtFKartennr.getText();
			System.out.println("Hier der Inhalt: " +blabla );
			gui_leeren();
			
			GUI_ATR.textArea.append("...Formular geleert!");
			
//------------------- ab hier Datenbanverbindung herstellen ------------------//
			
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			
			Connection con = DriverManager
					.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)}" 
								+ ";DBQ=C:/Dokumente und Einstellungen/dsv/Desktop/" 
								+ "Datenbank_Test.mdb");
			
			try {
				con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
                       } catch (SQLException sqle) {
                            sqle.printStackTrace();
                       }
                  con.close();
			}catch (Exception e) {
					e.printStackTrace();
			}
		});
	}

...nur funktioniert das nicht! vllt. ne Idee ?

gruß
 
ok, hab das Problem gelöst. hier die Lösung:

Java:
pruefung_abschließen.addActionListener(new ActionListener(){
		public void actionPerformed(ActionEvent e) {
			open_terminal();
			try {
			blabla = txtFKartennr.getText();
			System.out.println("Hier der Inhalt: " +blabla );
			gui_leeren();
			
			GUI_ATR.textArea.append("...Formular geleert!");
			
//------------------- ab hier Datenbanverbindung herstellen ------------------//
			
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			
			Connection con = DriverManager
					.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)}" 
								+ ";DBQ=C:/Dokumente und Einstellungen/dsv/Desktop/" 
								+ "Datenbank_Test.mdb");
			
			try {
				con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
                       } catch (SQLException sqle) {
                            sqle.printStackTrace();
                       }
                  con.close();
			}catch (Exception a) {
					a.printStackTrace();
			}
		}
	});
	}

vielen dank. ung schönen Tag noch 😉
 
Fehlermeldung posten?
ich glaube aber einen Fehler in der Klammerung zu sehen,

mach den Listener erstmal komplett leer, leere Methode, bis das Kompilieren wieder geht,
dann nur das try/ catch mit leerem Inhalt einfügen bis das kompiliert
usw.,


schrittweise vorgehen, besonders wenn du die sinnvollen Exceptions bzw. hier eher Compiler-Error nicht lesen kannst
 

Neue Themen


Zurück
Oben