[MS Access] Ich habe Mist gebaut. Bitte um Hilfe...

toothpick192

Grünschnabel
Hallo,
also wie der Titel schon sagt ich habe wirklich Mist gebaut. Ich habe auf der Arbeit nach Versicherung eines Kollegen angeblich auf einer Kopie einer MS Access DB etwas getestet. Wie sich heute rausstellte war es natürlich nicht eine Kopie sondern das Original :(

Ich habe eine halbwegs aktuelle Sicherheitskopie (zumindest die eine tabelle, die ich gelöscht habe ist aktuell). Allerdings kenne ich mich mit Access so gar nicht aus und wollte deswegen eine kleines Java-Programm schreiben welches die Tabelle ausliest und in die Original DB schreibt.

Auslesen funktioniert wunderbar, allerdings kann ich nichts zurückschreiben. Es gibt zwar keine Fehlermeldung beim schreiben, aber der Satz taucht hinterher nicht in der DB auf.

Hat hier jemand vielleicht ne Idee ?

Mit Dank im Voraus,
Christian

PS: hier der Code den ich benutze

Code:
public static void main(String[] args) {
		// TODO Auto-generated method stub
		DBConnect query = new DBConnect();
		ResultSet rs = query.doQuery("select * from 30_AU1");
		int i = 0;
		int auf_id = 0;
		int pos = 0;
		int kar_id = 0;
		int vk_stk = 0;
		int menge = 0;
		boolean berechnen_jn =true;
		int abc = 0;
		int lieOkun = 0;
		String bemerkung = "";
		ArrayList<Posis> posis = new ArrayList<Posis>();
		/*
		try {
			while(rs.next()){
				Posis x = new Posis();
				i++;
				auf_id = rs.getInt("au1_auf_id");
				pos = rs.getInt("au1_pos");
				kar_id = rs.getInt("au1_kar_id");
				vk_stk = rs.getInt("au1_vk_stk");
				menge = rs.getInt("au1_menge");
				berechnen_jn = rs.getBoolean("au1_berechnen_jn");
				abc = rs.getInt("au1_abc");
				lieOkun = rs.getInt("au1_lieokun");
				bemerkung = rs.getString("au1_bemerkung");
				x.setAuf_id(auf_id);
				x.setPos(pos);
				x.setKar_id(kar_id);
				x.setVk_stk(vk_stk);
				x.setMenge(menge);
				x.setAbc(abc);
				x.setLieOkun(lieOkun);
				x.setBemerkung(bemerkung);
				System.out.println(auf_id+","+pos+","+kar_id+","+vk_stk+","+menge+","+berechnen_jn+","+abc+","+lieOkun+","+bemerkung);
				posis.add(x);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(posis.size());
		*/
		query.doUpdate("insert into 30_AU1 (au1_auf_id,au1_pos,au1_bemerkung) values(3025294,0,Testcase)");
		
	}

}
bzw, die Klasse die die verbindung zur DB herstellt....
Code:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBConnect {
	private Statement statement;
	private Connection con;
	private ResultSet rs = null;
	
	public DBConnect() {
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
			Connection con = DriverManager.getConnection("jdbc:odbc:ep", "","");
			statement = con.createStatement();
		} catch (InstantiationException e) {
			System.out.println("^1");
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			System.out.println("^2");
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			System.out.println("^3");
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println("^4");
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public ResultSet doQuery(String query){
		
		try {
			rs = statement.executeQuery(query);
			return rs;
		} catch (SQLException e) {
			e.printStackTrace();
			return rs;
			
		}
		
	}
	public void doUpdate(String query){
		try {
			statement.executeUpdate(query);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public boolean closeAll(){
		try {
			rs.close();
			statement.close();
			con.close();
			return true;
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		
	}
}
 
Warum gehst du nicht einfach über die in Access eingebaute Import-Funktion?
Ist zu finden unter Datei->externe Datei->importiern. Dann wählst du deine Sicherung aus. Anschliessen kommt ein Assistent der dich fragt was wohin kopiert werden soll und fertig.
 
Moin toothpick192,

ein weiterer Grund, die kwwf-Empfehlung der beiden Vorposter zu unterstützen, sind zwei, drei Jobstopper in deinem Schnipsel.
a) Das kann nicht funktionieren:
Code:
....

query.doUpdate("insert into 30_AU1 (au1_auf_id,au1_pos,au1_bemerkung) 
values(3025294,0,Testcase)");
...

Unter Umständen könnte dieses etwas tun:
Code:
....
query.doUpdate("insert into 30_AU1 (au1_auf_id,au1_pos,au1_bemerkung) 
  values( 3025294, 0, 'Testcase')");
...
...aber auch nur, wenn wenigstens die "au1_auf_id" wirklich ein numerischer Wert ist, wie du mit deinem get_int() beim Lesen unterstellst. Falls die auch ein Access-Text-Typ ist--> auch in einfache Klammern setzen.

b) ausgerechnet die entscheidende Anweisung setzt du NICHT in einen try-catch-Block******

c) Ist denn die implizite Annahme gerechtfertigt, dass keinerlei Abhängigkeiten, insbesondere Foreignkey-Beziehungen zu anderen Tabellen existieren? Wenn die Access-Klamotte halbwegs professionell zusammengeschrotet worden ist, dann sind jetzt auch schon ein paar Tausend Child-Sätze "cascading" gelöscht und da, wo die meisten ITler mal hinkommen.

--> Im Ernst, ich habe nicht den Eindruck, als solltest du diese Reparatur mit anscheinend relativ wenig Datenbank-Erfahrung mit einem selbstgeklöppelten Schnipsel ohne eine einzige Kommentarzeile gegen eine "produktive" Tabelle durchführen.

Denk auf jeden Fall diesmal an dreifach vorhandene Sicherungskopien.

Grüße
Biber
 
Zuletzt bearbeitet:
Zurück