# Datenbankanbindung mit einem JButton



## Ci (27. Jun 2011)

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:


```
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);
		}
	}
}
```


```
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ß


----------



## SlaterB (27. Jun 2011)

du verrätst keine Fehlermeldungen?
mit Datenbanken kann wohl niemand dein Programm testen,
zumal unbekannte Klassen dabei sind und dann auch noch exotisches wie
javax.smartcardio.CardException

was ist eigentlich von dem parallel laufenden Thema mit ähnlich Inhalt
http://www.java-forum.org/allgemeine-java-themen/120698-datenbankanbindung.html
zu halten?


----------



## Ci (28. Jun 2011)

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ß


----------



## SlaterB (28. Jun 2011)

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


----------



## Ci (28. Jun 2011)

hier im Abschnitt ist doch mein try/catch:


```
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?


----------



## SlaterB (28. Jun 2011)

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


----------



## Ci (28. Jun 2011)

hier meine Main wo es auch funktionierts:


```
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:


```
try {
                
                con.createStatement().executeUpdate("INSERT INTO Tabelle1 (ATC,Chipkartennummer,Kurz_BLZ) VALUES ('" + blabla + "','" + b + "','" + c + "') ");
                       }catch (SQLException sqle) {
                            sqle.printStackTrace();
                       }
                  con.close();
            }
```


----------



## SlaterB (28. Jun 2011)

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


----------



## Ci (28. Jun 2011)

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?


----------



## SlaterB (28. Jun 2011)

ja


----------



## Ci (28. Jun 2011)

habs jetzt mal einfach so ausprobiert:


```
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ß


----------



## Ci (28. Jun 2011)

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


```
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


----------



## SlaterB (28. Jun 2011)

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


----------

