eine mysql tabelle in eine access db inserten

TimoP

Grünschnabel
Ich möchte gerne aus einer mysql db eine tabelle mit inhalt in eine access db kopieren bzw mit einem insert string schreiben ich habe folgendes bereits getan. Brauche einen weiter denk anstoß

Code:
	static String driver   = "com.mysql.jdbc.Driver";
	static String url 	   = "jdbc:mysql://localhost:3306/";
	static String user     = "chef";
	static String password = "xxx";
	static String database = "xml_edi_tmp";
	static Connection con  = null;
	static Connection conmdb  = null;
	static boolean laden=false;	
	static Datei datei2=new Datei();
	static String text=null;
	
//***********************************DB Funktion*************************************************
	public static void db_con() throws Exception 
		{
		
//			Access Variante		
	  		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
	  		conmdb = DriverManager.getConnection("jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ=e:/daten/xml.mdb");
			
//			Mysql Vaiante
	  		Class.forName(driver);
	  		con = DriverManager.getConnection(url+database, user, password);	
	  	}
	public static void main(String param[])
		{
			
                   db_con();		//db funktion aufrufen startet die db connection
				
                                Statement stmt1 = con.createStatement();
				
				stmt1.executeUpdate("Insert into `xml` select * from `xml_edi_tmp`");
				stmt1.close();
				
				

}
 
TimoP hat gesagt.:
Code:
stmt1.executeUpdate("Insert into `xml` select * from `xml_edi_tmp`");

Dies kann nicht gehen da stmt1 auf der MySQL-Verbindung arbeitet, du die Daten aber in die Access-Datenbank einfügen möchtest.

Entweder guckst du dir mal DdlUtils von Apache an oder machst es etwas komplizierter direkt in Java.

Dazu musst du auf der MySQL Verbindung die Daten aus der gewünschten Tabelle mit einem SELECT-Statement abrufen und das ResultSet dann Zeile für Zeile durchlaufen und dabei die Daten in die Access-Datenbank einfügen.
Java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author zeja
 */
public class CopyTable {
	
	private static String mySQLDriver   = "com.mysql.jdbc.Driver";
	private static String url 	   = "jdbc:mysql://localhost:3306/";
	private static String user     = "chef";
	private static String password = "xxx";
	private static String database = "xml_edi_tmp";

	public static void main(String param[]) {
		Connection mySQL = createMySQLConnection(url+database,user,password);
		Connection access = createAccessConnection("e:/daten/xml.mdb");
		
		try {
			copyTable(mySQL,access,"xml_edi_tmp","xml");
			
		}
		catch (SQLException e) {
			System.err.println("Error: " + e.getMessage() + "\n");
		}
		finally{
			try {
				access.close( );
			}
			catch (SQLException e) {
				System.err.println("Error: " + e.getMessage() + "\n");
			}
		}
	}
	
	public static void copyTable(Connection from, Connection to, String tableFrom, String tableTo) throws SQLException{
		Statement fromStmt = from.createStatement( );
		
		ResultSet set = fromStmt.executeQuery("SELECT * FROM "+tableFrom);
		ResultSetMetaData meta = set.getMetaData( );
		int colCount = meta.getColumnCount( );
		while(set.next( )){
			Statement toStmt = to.createStatement( );
			StringBuffer insert = new StringBuffer();
			insert.append("INSERT INTO ").append(tableTo).append(" VALUES(");
			for(int i = 1; i <= colCount; i++){
				String value = set.getString(i);
				insert.append("'").append(value).append("'");
				if(i != colCount){
					insert.append(", ");
				}
			}
			insert.append(")");
			String sqlInsert = insert.toString( );
			
			System.out.println(sqlInsert);
			
			toStmt.executeUpdate(sqlInsert);
			toStmt.close( );
		}
		set.close();
		
		fromStmt.close( );
	}
	
	public static Connection createConnection(String driver, String connectionString,String user, String password){
		try {
			Class.forName(driver);
			Connection con = DriverManager.getConnection(connectionString, user, password);
			return con;
		}
		catch (ClassNotFoundException e) {
			System.err.println("Error: " + e.getMessage() + "\n");
		}
		catch (SQLException e) {
			System.err.println("Error: " + e.getMessage() + "\n");
		}
		return null;
		
	}
	
	public static Connection createAccessConnection(String fullPath){
		return createConnection("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:DRIVER={Microsoft Access Driver (*.mdb)};DBQ="+fullPath,"","");
	}
	
	public static Connection createMySQLConnection(String connectionString,String user, String password){
		return createConnection(mySQLDriver,connectionString,user,password);
	}
}
 
Danke für die Antwort das mit zeile für Zeile war auch meine erste Idee aber das dauert mir zu lange da in der mysql db bis zu 1 million einträge sein können und die Anwendung so schnell wie möglich laufen soll. Am liebsten wäre es mir wenn es mit einer insert .. select from gehen würde. Also mit access und einem mssql geht das aber die frage ist nun ist das auch mit mysql möglich in java


Edit: Habe deins mal getestet bei 40 tausend artikel ist die zeit ganz ok. Unter einer Minute mit den 1 million artikel kann ich erst Montag testen
 
Zuletzt bearbeitet:
Hallo!

Also ich denke das läßt sich etwas pragmatischer lösen.
Leg für die MySQL Datenbank einfach eine ODBC Datenquelle in Systemsteuerung/Verwaltung/ODBC Datenquellen an.
Anschließend öffnest du deine Access Datenbank und bindest die gewünschte Tabelle über eine ODBC-Verknüpfung in deine Access DB ein. Danach kannst du dann über eine Tabellenerstellungsabfrage die Daten aus der MySQL Datenbank in eine neue Tabelle in der Access DB kopieren lassen.

Gruß Tom
 
Das habe ich bereits versucht hat leider nicht geklappt.

Etwas zum hintergrunde vielleicht:

Ich Parse mit Sax eine xml datei diese Datein können zwischen 10 und 50 Tausend Artikel beinhalten. Ich Speichere dann diese dinge in einer mysql db. leider ist bis her das programm (alte) noch auf einer access db so das ich die daten dann aus der mysql in die access db schreiben muss. Das Funktioniert mit dem Parsen auch sehr gut brauche für 34 Tausend artikel ca 19 sekunden mit eintragen in die mysql, mache dabei 1 insert und 3 updates da die xml schlecht aufbereitet ist.

So nun muss aber immer am ende meiners progs die daten noch aus der sql in die access. Das Programm wird immer gestartet wenn der kunde neue xml datein bekommt ca 1 mal am Tag.
 

Neue Beiträge

Zurück