# Daten in Datenbanken einfügen



## KimKaze (18. Okt 2007)

Hi,

ich habe ein kleines Problem.. ich weiss nicht genau wie ich etwas in eine Datenbank einfügen kann...

Treiber geladen,
Verbindung hergestellt..

meine .mdb Datenbank hat 4 Spalten, Programm User Vorname Nachname
Außerdem habe ich ein Array mit 4 Spalten, die Daten sind in gleicher Reihenfolge wie oben gespeichert...
z.B. AcrobatReader - 1 - Hans - Weitz
das ganze Splitte ich und schreibs in 4 variablen
sAnwendung entspricht AcrobatReader
sUser entspricht 1
sVorname entspricht Hans
sNachname entspricht Weitz

wie kann ich die daten aus dem array nun in die DB schreiben / einfügen  ???
am besten zeile für zeile (siehe schleife)

quellcode anbei


```
import java.io.*;
import java.sql.*;

public class Datenbanken {

	public static void main(String[] args) throws IOException {
		String sZeileEinlesen;
		String sAnwendung;
		String sUserID;
		String sVorname;
		String sNachname;

		
		final int ANWENDUNG = 0;
		final int USER_ID 	= 1;
		final int VORNAME 	= 2;
		final int NACHNAME 	= 3;
		
		//Datenbank-treiber laden
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		}
		catch (Exception e){
			System.out.println("JDBC / ODBC - Treiber konnte nicht geladen werden!");
		}
		
		//Verbindung zur DB aufbauen
		Statement befehl = null;
		Connection verbindung = null;
		try{
			verbindung = DriverManager.getConnection("jdbc:odbc:Tabelle1");
			befehl = verbindung.createStatement();
		}
		catch (Exception e) {
			System.out.println("Verbindung zu jdbc:odbc:Tabelle1 konnte nicht hergestellt werden");
		}
		
		
		try
		{
			// ab hier wird die Datei eingelesen und in einen Array gespeichert
			FileReader eingabestromdatei = new FileReader("D:\\Eclipse Projekte\\Datenbanken1\\Zuordnung.txt");
			BufferedReader b = new BufferedReader(eingabestromdatei);
			boolean ende = false;
			while(!ende){
				sZeileEinlesen = b.readLine();
				if (sZeileEinlesen == null){
					ende = true;
	        		} // ende von then
				else {	
					String Zeile[] = sZeileEinlesen.split("-"); // datei wird bei allen "-" gesplittet und in den neuen array gespeichert
					if (Zeile.length > ANWENDUNG ){
						sAnwendung = Zeile[ANWENDUNG].trim(); //Anwendung oben als final int deklariert
					}
					else {
						sAnwendung = " ";
					}
					if (Zeile.length > USER_ID ){
						sUserID = Zeile[USER_ID].trim(); //UserID oben als final int deklariert
					}
					else {
						sUserID = " ";
					}
					if (Zeile.length > VORNAME ){
						sVorname = Zeile[VORNAME].trim(); //Vorname oben als final int deklariert
					}
	        		else {
	        			sVorname = " ";
	        		}
	        		if (Zeile.length > NACHNAME ){
	        			sNachname = Zeile[NACHNAME].trim(); //Nachname oben als final int deklariert
	        		}
	        		else {
	        			sNachname = " ";
	        		}
	        	} // ende von else
				
				// hier wird in die Datenbank geschrieben zu der oben connectet wurde !!
				
				
				
				
				
				
				
				
			} // ende von while (!ende)
			b.close();
			} // ende von try
			catch(FileNotFoundException e){ // datei nicht gefunden beim speichern der daten in array
				System.out.println("Datei nicht gefunden!");
			} // ende von catch
	} // ende void main
} // ende class Zuordnung
```


----------



## DP (18. Okt 2007)

hi. zuerst solltest du beim schreiben in die db ein preparedstatement nehmen.

das sieht dann bei Dir so aus:


```
String sql = "insert into Tabelle1 (anwendung, user_id, vorname, nachname) values(?, ?, ?, ?)";
PreparedStatement befehl = con.prepareStatement(sql);
```

dann baust du in deine schleife zum schluss ein:


```
befehl.setString(1, sAnwendung);
befehl.setString(2, sUserID);
befehl.setString(3, sVorname);
befehl.setString(4, sNachname);
befehl.addBatch();
```

und nachdem die schleife verlassen wurde machst du


```
befehl.executeBatch();
befehl.close();
```

wenn du anstatt nach der schleife bei jedem schleifendurchlauf in die db schreiben willst, dann machst du anstatt dem addBatch() ein executeBatch() und nach der schleife nur ein close();

cu


----------



## KimKaze (19. Okt 2007)

Hi danke für die Antwort, aber kommt noch ein kleiner fehler

PreparedStatement befehl = con.prepareStatement(sql);
                                                          Unhandled exception type SQLException


----------



## DP (19. Okt 2007)

du musst das in einen try-block setzen.


----------



## KimKaze (19. Okt 2007)

```
import java.io.*;
import java.sql.*;

public class Datenbanken {

	public static void main(String[] args) throws IOException {
		String sZeileEinlesen;
		String sAnwendung;
		String sUserID;
		String sVorname;
		String sNachname;

		
		final int ANWENDUNG = 0;
		final int USER_ID 	= 1;
		final int VORNAME 	= 2;
		final int NACHNAME 	= 3;
		
		//Datenbank-treiber laden
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		}
		catch (Exception e){
			System.out.println("JDBC / ODBC - Treiber konnte nicht geladen werden!");
		}
		
		//Verbindung zur DB aufbauen
		Statement befehl = null;
		Connection verbindung = null;
		try{
			verbindung = DriverManager.getConnection("jdbc:odbc:Tabelle1");
			befehl = verbindung.createStatement();
		}
		catch (Exception e) {
			System.out.println("Verbindung zu jdbc:odbc:Tabelle1 konnte nicht hergestellt werden");
		}
		
		
		try
		{
			try {

				String sql = "insert into Tabelle1 (Anwendung, UserID, Vorname, Nachname) values(?, ?, ?, ?)";
				PreparedStatement Insertbefehl = verbindung.prepareStatement(sql);
				
			// ab hier wird die Datei eingelesen und in einen Array gespeichert
			FileReader eingabestromdatei = new FileReader("D:\\Eclipse Projekte\\Datenbanken1\\Zuordnung.txt");
			BufferedReader b = new BufferedReader(eingabestromdatei);
			boolean ende = false;
			while(!ende){
				sZeileEinlesen = b.readLine();
				if (sZeileEinlesen == null){
					ende = true;
	        		} // ende von then
				else {	
					String Zeile[] = sZeileEinlesen.split("-"); // datei wird bei allen "-" gesplittet und in den neuen array gespeichert
					if (Zeile.length > ANWENDUNG ){
						sAnwendung = Zeile[ANWENDUNG].trim(); //Anwendung oben als final int deklariert
					}
					else {
						sAnwendung = " ";
					}
					if (Zeile.length > USER_ID ){
						sUserID = Zeile[USER_ID].trim(); //UserID oben als final int deklariert
					}
					else {
						sUserID = " ";
					}
					if (Zeile.length > VORNAME ){
						sVorname = Zeile[VORNAME].trim(); //Vorname oben als final int deklariert
					}
	        		else {
	        			sVorname = " ";
	        		}
	        		if (Zeile.length > NACHNAME ){
	        			sNachname = Zeile[NACHNAME].trim(); //Nachname oben als final int deklariert
	        		}
	        		else {
	        			sNachname = " ";
	        		}
	        		// hier wird in die Datenbank geschrieben zu der oben connectet wurde !!
	        		Insertbefehl.setString(1, sAnwendung);
	        		System.out.print(sAnwendung+ " ");
	        		Insertbefehl.setString(2, sUserID);
	        		System.out.print(sUserID+ " ");
	        		Insertbefehl.setString(3, sVorname);
	        		System.out.print(sVorname+ " ");
	        		Insertbefehl.setString(4, sNachname);
	        		System.out.println(sNachname);
	        		Insertbefehl.executeBatch();
	        			        		
	        	} // ende von else
			}// ende von while (!ende)
			b.close();
			Insertbefehl.close();
			}
			catch (Exception e){
				e.printStackTrace();
			}
			
			} // ende von try
			catch(Exception e){ // datei nicht gefunden beim speichern der daten in array
				System.out.println("Datei nicht gefunden!");
			} // ende von catch
```

so sollte es ja dann eigentlich klappen... in dem bereich der ausgabe gibt er zwar das ganze in der konsole aus.. .aber nicht in der db... muss ich nachdem ich das programm beendet habe noch irgendwas in der db machen oder sollte es dann sofort funktionieren ?


----------



## DP (19. Okt 2007)

sorry, habe mich vertippt. mach aus dem executebatch ein execute() dann passt das


----------



## KimKaze (19. Okt 2007)

ahso, alles klar, klappt wunderbar. dankeschön


----------

