# Datenbank Abfragen in eine GUI schreiben



## erdmulch (11. Dez 2011)

Hallo zusammen,

habe folgendes Problem:
Ich will eine Datenbankanbindung machen und eine Abfrage starten.
mein Java Programm besteht aus 4 Klassen:

der Gui
eine Klasse zum initialisieren der datenbank
eine Klasse die die Verbindung zu der Access Datenbank aufnimmt
und eine Klasse die eine Abfrage macht

die Klassen funktionieren getrennt sehr gut
nun will ich das Abfrage-Ergebnis in eine GUI schreiben

leider kommt folgende Meldung:
Exception in thread "main" java.lang.NullPointerException

kann mir jemand sagen was ich falsch mache?


Gui

```
// Tabelle anlegen
   Table modell = new Table();
   table = new JTable(modell);
   table.getTableHeader().setBackground(Color.YELLOW);
      
   JScrollPane pane = new JScrollPane(table);
   pane.setBounds(10, 80, 950, 220);
   Panel1.add(pane);
   
   // befüllen
   fuelleTabelle(tq.gibMirDaten());
```


initialisieren der datenbank

```
import javax.swing.table.AbstractTableModel;



public class Table extends AbstractTableModel
{
	String[] spaltenNamen = {"Name.", "Vorname", "Geburtsdatum", "Email", "Mobiltelefon", "Telefon", "Fax"};
	Object[][] daten = new Object [30][7];
	
	public int getRowCount()
	{
		return daten.length;
	}
	
	public int getColumnCount()
	{
		return spaltenNamen.length;
	}
	
	public String getColumnName(int num)
	{
		return spaltenNamen[num];
	}
	
	public boolean isCellEditable(int x, int y)
	{
		return false;
	}
	
	public Object getValueAt(int x, int y)
	{
		return daten [x][y];
	}
	
	public void setValueAt(Object obj, int x, int y)
	{
		daten[x][y] = obj;
		fireTableDataChanged();
	}
	
	
	
	
}
```

Verbindung zu der Access Datenbank

```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class TableConnection 
{
	Connection con;
	Statement stmt;
	ArrayList<String> ergebnis = new ArrayList<String>();
	
	public TableConnection()
	{

	    try 
	    {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		} 
	    catch (ClassNotFoundException e) 
	    {
			System.out.println("Fehler bei JDBC-ODBC-Brücke");
		}

		try 
		{
			// mit temporären ODBC-Treiber
			String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};"+ "DBQ=Datenbank/kontakte.mdb";
			con = DriverManager.getConnection(url);
		}

		catch (SQLException s) 
		{
			System.out.println("DB-Verbindungsfehler: " + s);
		}


	    
	    
	}


	
	

}
```


Klasse die eine Abfrage macht

```
public class TableQuery
{
	Connection con;
	Statement stmt;
	ArrayList<String> ergebnis = new ArrayList<String>();
	
	public ArrayList<String> gibMirDaten() 
	{
		
		String query = "SELECT * FROM buechertabelle;";

		try 
		{
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(query);

			while (rs.next()) 
			{
				for (int i = 1; i <= 7; i++) 
				{
					ergebnis.add(rs.getString(i));
				}
			}
		} 
		catch (SQLException e) 
		{
			
			System.out.println(e);
		}
		return ergebnis;
	}

}
```


----------



## Camino (11. Dez 2011)

erdmulch hat gesagt.:


> leider kommt folgende Meldung:
> Exception in thread "main" java.lang.NullPointerException
> 
> kann mir jemand sagen was ich falsch mache?



Hallo, es wäre noch prima, wenn du auch dazuschreiben könntest, wo diese Fehlermeldung auftritt, das erleichtert die Fehlersuche für uns ungemein...


----------



## erdmulch (11. Dez 2011)

Exception in thread "main" java.lang.NullPointerException
	at TableQuery.gibMirDaten(TableQuery.java:22)

]


----------



## Camino (11. Dez 2011)

```
while (rs.next()) 
            {
                for (int i = 1; i <= 7; i++) 
                {
                    ergebnis.add(rs.getString(i));
                }
            }
```

Vielleicht hast du dich vertan, und es gibt garnicht so viele Strings (Spalten) in deinem ResultSet. Kannst ja in der Schleife mal probeweise den String auf der Konsole ausgeben lassen, um zu schauen, was da drin steht, bzw. wieviele Strings tatsächlich ausgegeben werden.


----------



## erdmulch (11. Dez 2011)

das stimmt, war auch mein erster Gedanke!
der Fehler muss irgendwo bei der Wertübergabe liegen!


----------



## Camino (11. Dez 2011)

Bei einer NullPointerException muss halt irgendwas null sein. Wenn man dann weiss, wo das auftritt, gibt es ja nicht mehr so viele Möglichkeiten und man kann z.B. durch Ausgabe auf der Konsole schauen, wo genau und wann irgendwas null ist. Da ich deine Datenbankstruktur nicht kenne, war das jetzt von mir halt erstmal geraten, mit der Anzahl der Spalten.


----------



## Final_Striker (11. Dez 2011)

erdmulch hat gesagt.:


> das stimmt, war auch mein erster Gedanke!
> der Fehler muss irgendwo bei der Wertübergabe liegen!



Wie wäre es, wenn du einfach ein Paar
	
	
	
	





```
System.out.println(...)
```
 einbaust und selbst rausfindest was 
	
	
	
	





```
null
```
ist?


----------



## erdmulch (11. Dez 2011)

Hallo zusammen,

habe es hinbekommen. Das Problem war, das in der variablen "con" kein wert hinterlegt war. hab es mal in eine Klasse gepackt uns siehe da, es funktioniert.
Allerdings will ich die Datenbankverbindung und die SQL Abfragen in getrennte Klassen machen. Da ich es objekt orientiert programmieren will.

jetzt meine Frage:
kann ich die variablen in eine extra klasse auslagern um von beiden Klassen auf diese zugreifen zu können? wenn ja wie?

danke im voraus



```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

public class TableConnection 
{
	Connection con;
	Statement stmt;
	ArrayList<String> ergebnis = new ArrayList<String>();
	
	public TableConnection()
	{
	    try 
	    {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		} 
	    catch (ClassNotFoundException e) 
	    {
			System.out.println("Fehler bei JDBC-ODBC-Brücke");
		}
		try 
		{
			// mit temporären ODBC-Treiber
			String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};"+ "DBQ=Datenbank/kontakte.mdb";
			con = DriverManager.getConnection(url);
		}
		catch (SQLException s) 
		{
			System.out.println("DB-Verbindungsfehler: " + s);
		}
	}

	public ArrayList<String> gibMirDaten() 
	{	
		String query = "SELECT * FROM buecher;";
		try 
		{
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(query);

			while (rs.next()) 
			{
				for (int i = 1; i <= 7; i++) 
				{
					ergebnis.add(rs.getString(i));
				}
			}
		} 
		catch (SQLException e) 
		{
			
			System.out.println(e);
		}
		return ergebnis;
	}
}
```


----------



## erdmulch (11. Dez 2011)

hab´s hin bekommen.
vor lauter Bäume hab ich den Wald nicht gesehen 

es geht natürlich mit der set und get Methode


----------

