# Zwischen Datenbanken wechseln



## Einklang. (2. Jul 2012)

Hallo,

die Arrays habe ich jetzt erst os richtig verstanden und es war keine Lösung, daher jetzt eine andere:
Daten aus einer Datenbank bei einem Host in eine lokale Datenbank schreiben.

Bisher funktioniert gut: Daten aus Datenbank vom Host holen und anzeigen.

Eröffne ich aber jetzt dazwischen die Verbindung zur lokalen Datenbank, um die Daten zu schreiben, kommt eine "NullException"

Der Code sieht so aus:


```
public void testconnectionDB(DefaultTableModel defaultTableModel)
    {
    	
    	getInstance().createDBConnection();
    if(dbconnection==null)
    {
        System.out.println("Abfrage nicht möglich, Connection ist null");
        System.out.println(dbconnection);
        return;
        }
    try
        {
        
    	
        
        // Code aus dem Buch MySQL CookBook Seite 439
    	int i = 1; 
        Statement s = dbconnection.createStatement();
        
        s.executeQuery ("Show tables");
        ResultSet resulttable = s.getResultSet ( );
              
        while (resulttable.next())
         {
        	 System.out.println("Tabelle in Datenbank gefunden: " + resulttable.getString(1));
        	 String tabelle= resulttable.getString(1);
        	 System.out.println("Tabellenname zum Zweiten: " + tabelle);
        	 ResultSetMetaData mdtable = resulttable.getMetaData ( );
        	 // String tabellenname = resulttable.getString(1);
        	 
        	[COLOR="DarkRed"] /* HIER VERBINDUNG MIT LOKALER DATENBANK AUFNEHMEN UND IN TABELLE TABELLENINFOS den NAMEN DER TABELLE SCHREIBEN!!!!!!!! */
        	Statement lc = connection.createStatement();
        	ResultSet resultlokal= lc.getResultSet();
        	// lc.executeQuery("Insert into tabelleninfos (tabname) values (" + tabellenname + ")");[/COLOR]
        	 
        	 // String tabellenname = mdtable.getColumnName(1);
        	 // System.out.println(tabellenname);
        	 Statement stat = dbconnection.createStatement();
        	 stat.executeQuery("Select * from " + resulttable.getString(1));
        	 ResultSet tabellenabfrage = stat.getResultSet();
        	 ResultSetMetaData tabellemeta = tabellenabfrage.getMetaData ( );
        	 int spaltenzahl = tabellemeta.getColumnCount();
        	 System.out.println("Spaltenanzahl der Tabelle: " + spaltenzahl);
        	 
        	 if (tabellenabfrage.next())
        	 {
        		 
        		 for (i = 1; i <= spaltenzahl; i++)
        		 {
        			 System.out.println("Type der Daten aus der Spalte " + tabellemeta.getColumnLabel(i) + ": " + tabellemeta.getColumnTypeName(i));
        		 
        		 }
        	 }
        	 
         }
```

Fehlermeldung entsteht bei "Statement lc = connection.createStatement();" - wenn also eine neue Verbindung aufgebaut wird zur lokalen Datenbank: 





> Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> at ButtonDBTablezweite.testconnectionDB(ButtonDBTablezweite.java:213)
> at ButtonDBTable.testDBActionPerformed(ButtonDBTable.java:563)
> at ButtonDBTable.access$8(ButtonDBTable.java:559)
> ...


----------



## VfL_Freak (2. Jul 2012)

Moin,

wie die Fehlermeldung schon besagt, ist hier:


> at ButtonDBTablezweite.testconnectionDB(ButtonDBTablezweite.java:213)


etwas gleich null!

Leider geht aus Deinem Codeausschnitt nicht hervor, was in Zeile 213 steht ....

Gruß
Klaus


----------



## Einklang. (2. Jul 2012)

Naja die Fehlermeldung kommt erst wenn ich die Verbindung zur lokalen Datenbank aufbaue...... eine Verbindung zur gleichen Datenbank mit neuem SQL Befehle macht ja nichts aus.... daher liegt das Problem eben an dem Aufbau einer Verbindung zur lokalen Datenbank....!

Und jetzt gesehen: es ist Zeile 213! ;-)


----------



## SlaterB (2. Jul 2012)

"Statement lc = connection.createStatement();"
wie du selber sagst,
und connection kann doch null sein, dazu sagst du nix im letzten Posting,
niemand anders kann dazu etwas sagen


----------



## Einklang. (2. Jul 2012)

Jup genau und die Frage ist warum - weiter unten von der VErbindung lc ist eine Verbindung zu der Datenbank beim Host, zu der obe nschon verbunden wurde.

Im Grund möchte ich ja die Daten abholen vom Host, dann in eine lokale Datenbank schreiben und wieder Daten vom Host abholen und in die lokale Datenbank schreiben....!
(evtl. ist dieser Lösungsansatz ja auch nicht sehr vorteilhaft durch die unterschiedlichen und häufigen Verbindungsaufbau zu verschiedenen Datenbanken?)


----------



## Marcinek (2. Jul 2012)

Den Sinn, warum man das so macht, habe ich nicht erschlossen.

Deine Verbindung ist null, weil diese Variable vorher keinen Wert zugewiesen bekommt.

Zeige mir die Zeile (+- 10) in der du hier einen Wert zuweist.


----------



## SlaterB (2. Jul 2012)

connection ist einfach nur null, 
von Host usw. kann keine Rede sein solange mit keiner Zeile zu sehen ist, was connection ist


----------



## Einklang. (2. Jul 2012)

Ach genau jetzt geht es schonmal - die Methode nicht instanziiert...! 


Jetzt ist noch folgende Fehlermeldung vorhanden: "SQL-Exception bei der Abfrage: Can not issue data manipulation statements with executeQuery()." - das betrifft diese Zeile:

```
lc.executeQuery("Insert into tabelleninfos (tabname) values (" + tabelle + ")");
```

Ich weiß jetzt nicht was mit "data manipulation" gemeint ist...!??


Danke


----------



## Marcinek (2. Jul 2012)

Can not issue data manipulation statements with executeQuery - Google Search


----------



## SlaterB (2. Jul 2012)

"data manipulation" ist z.B. ein Insert, 
executeQuery() ist nur für SELECT da, gibt aber noch mehr Methoden die mit execute anfangen


----------



## Einklang. (2. Jul 2012)

ah ok super dann muss ich für die anderen SQL-Befehle also andere Java-Befehle nutzen... ok!


----------



## Einklang. (2. Jul 2012)

Wie würdet ihr das machen um Daten aus einer SQL Datenbank auf einem Server in eine lokale  SQL-Datenbank zu bekommen?

Ich habe jetzt nämlich das Problem, in einer Schleife, bei der die verschiedenen Spalten einer Tabelle durchgegangen werden, Informationen in eine andere Tabelle zu schreiben....! 


```
if (tabellenabfrage.next())
        	 {
        		 
        		 for (i = 1; i <= spaltenzahl; i++)
        		 {
        			 System.out.println("Type der Daten aus der Spalte " + tabellemeta.getColumnLabel(i) + ": " + tabellemeta.getColumnTypeName(i));
        			 Statement loc = connection.createStatement();
        	        	ResultSet resultlok= lc.getResultSet();
        	        	lc.executeUpdate("Insert into tabelleninfos (tabname, spaltname, spalttype) values ('" + tabelle + ", " + tabellemeta.getColumnLabel(i) + " + tabellemeta.getColumnTypeName(i) ')");
        		 }
        	 }
        	 
         }
```


Kann das so überhaupt funktionieren oder muss ich doch eine andere Lösung suchen, evtl was mit einbauen (einreihiges array als Zwischenspeicher) usw usf??

Danke


----------



## Fab1 (2. Jul 2012)

Es besteht ja sicherlich die Möglichkeit die Datenbank vom Server zu exportieren, dann musst du diese bei dir nur wieder importieren


----------



## Einklang. (2. Jul 2012)

Ja diese Lösung wäre mir aber lieber, weil ich später auch noch die Daten aus der Datenbank holen will mit täglicher Aktualisierung bzw überhaupt Aktualisierung der lokalen Datenbank.

Sonst müsste ich jetzt auch damit anfangen wie man Dateien ausliest und bearbeitet....  jede Menge was schiefgehen kann und hier sieht es so aus als obs schon fast klappt! ;-)

Danke


----------

