zerberos Geschrieben 10. September 2007 Teilen Geschrieben 10. September 2007 Hallo, ich habe Daten die ich aus einer oracle datenbank auslese. Diese möchte ich nun in eine Access db schreiben. mein code sieht so aus: // Connections OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb"); OracleConnection con2 = new OracleConnection("User ID=test;password=test; Data Source=test"); //Tabelle in Access erstellen string tabellenname = "test"; string tabelle = "CREATE TABLE "+ tabellenname; OleDbCommand cmd = new OleDbCommand(tabelle, con); con.Open(); OleDbDataReader dr = cmd.ExecuteReader(); //Oracle auslesen string commandString = Txt_SQL.Text; OracleDataAdapter DataAdapter = new OracleDataAdapter(commandString, con2); DataTable dt = new DataTable(); DataAdapter.Fill(dt); DataSet ds = new DataSet(); DataAdapter.Fill(ds); //Access db füllen string sql2 = "SELECT * from " + tabellenname; OleDbDataAdapter dadapter = new OleDbDataAdapter(sql2,con); dadapter.Update(ds, tabellenname); dr.Close(); con.Close(); nur bekomme ich momentan folgende Fehlermeldung: Aktualisieren: TableMapping['test'] oder DataTable 'test' kann nicht gefunden werden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
U-- °LoneWolf° Geschrieben 10. September 2007 Teilen Geschrieben 10. September 2007 Hi kannst du mal die sql statements posten? und ich kenne den dataadapter nciht genaus aber du rufst die update funktion auf sollte es da nciht auch eine insert funktion geben? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zerberos Geschrieben 10. September 2007 Autor Teilen Geschrieben 10. September 2007 sql statments sind doch egal die sind richtig sehen so aus: Select * from tabelle1 die abfrage der daten aus der oracle Datenbank funktioniert auch einwandfrei. Die lade ich ja in den DataAdapter. Da habe ich ja dann die Daten + die Struktur drinnen stehen. Jetzt kommt das Problem. Die Access Datenbank ist festgelegt. Nur jetzt muss ich in dieser Access Datenbank eine neue Tabelle erstellen mit der Struktur die im OracleDataAdapter festgelegt ist und dann halt auch mit den Daten füllen. Und da weiß ich nicht wie das geht. Kann gut sein das der update befehl da totaler mist ist. Nur wie mache ich das? bin echt am verzweifeln... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
grueni Geschrieben 10. September 2007 Teilen Geschrieben 10. September 2007 Gibts die Tabelle "test" in deiner Access-DB überhaupt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
realgun Geschrieben 10. September 2007 Teilen Geschrieben 10. September 2007 Sieht so aus als würde die Tabelle in Oracle "tabelle1" heißen, in Access aber "test". Entweder gleichst Du die Namen an, oder Du brauchst ein "TableMapping", damit der Adapter weiß das "tabelle1" und "test" den gleichen Aufbau besitzen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zerberos Geschrieben 10. September 2007 Autor Teilen Geschrieben 10. September 2007 @grueni ja die Tabelle test gibt es. die erstelle ich ja mit: //Tabelle in Access erstellen string tabellenname = "test"; string tabelle = "CREATE TABLE "+ tabellenname; OleDbCommand cmd = new OleDbCommand(tabelle, con); con.Open(); OleDbDataReader dr = cmd.ExecuteReader(); die ist halt nur noch komplett leer. Die Struktur mmöchte ich erstellen. nur weiß nicht wie @realgun ja tabellennamen sind gleich! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zerberos Geschrieben 11. September 2007 Autor Teilen Geschrieben 11. September 2007 neuer status: bin was weiter wenn ich mir ankucke was in dem command cmd steht. da steht folgendes drinnen: CREATE TABLE test_tbl( System.String tbl_wert_1, System.String tbl_wert_2, System.String tbl_wert_3, System.Decimal tbl_wert_4, System.Decimal tbl_wert_4,) beim cmd.ExecuteNonQuery(); fliegt der dann mit folgender Meldung raus: Syntaxfehler in Felddefinition. mein ganzer code sieht so aus: OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb"); string tabellenname = "testtabelle"; OracleConnection con2 = new OracleConnection("User ID=test;password=test; Data Source=test"); string commandString = Txt_SQL.Text; OracleDataAdapter DataAdapter = new OracleDataAdapter(commandString, con2); DataTable dt = new DataTable(); DataAdapter.Fill(dt); StringBuilder sb = new StringBuilder(); sb.Append("CREATE TABLE "); sb.Append(tabellenname); sb.Append("("); foreach (DataColumn field in dt.Columns) { sb.AppendFormat(" {0} {1},", field.DataType.ToString(), field.ColumnName); } sb.Append(")"); OleDbCommand cmd = new OleDbCommand(sb.ToString(), con); con.Open(); cmd.ExecuteNonQuery(); con.Close(); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
realgun Geschrieben 11. September 2007 Teilen Geschrieben 11. September 2007 neuer status: CREATE TABLE test_tbl( System.String tbl_wert_1, System.String tbl_wert_2, System.String tbl_wert_3, System.Decimal tbl_wert_4, System.Decimal tbl_wert_4,) So was kann ja auch nicht funktionieren. Da gibt es zweimal den gleichen Spaltennamen (tbl_wert_4)... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zerberos Geschrieben 11. September 2007 Autor Teilen Geschrieben 11. September 2007 jo das ist behoben. aber trotzdem der gleiche fehler Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
realgun Geschrieben 11. September 2007 Teilen Geschrieben 11. September 2007 Also ich weiß zwar nicht wie das bei Access ist, aber bei SQL lautet die Definition für Tabellen eigenlich so: Create table NAME (FELDNAME1 datentyp , FELDNAME2 datentyp , ...) Bei Dir sind Feldname und Datentyp aber andersrum. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zerberos Geschrieben 11. September 2007 Autor Teilen Geschrieben 11. September 2007 ja das hab ich auch gerade bemerkt und umgeändert. Das Problem ist das der mir da als datentyp ja z.B. System.String reinschreibt und den gibt es ja nicht. daher hab ich keine ahnung wie ich da den richtigen datentyp für access reinbekomme Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zerberos Geschrieben 11. September 2007 Autor Teilen Geschrieben 11. September 2007 ok hab es erstmal geschafft mir eine tabelle mit der struktur zu erstellen kann mir einer sagen wie ich meine Daten da jetzt reinbekomme. Hab das mit Update versucht. Das klappt aber irgendwie nicht... mein momentaner code: OracleConnection con2 = new OracleConnection("User ID=test;password=test; Data Source=test"); string commandString = Txt_SQL.Text; OracleDataAdapter DataAdapter = new OracleDataAdapter(commandString, con2); DataTable dt = new DataTable(); DataAdapter.Fill(dt); DataSet ds = new DataSet(); DataAdapter.Fill(ds); OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\db.mdb"); string tabellenname = "test_table"; OleDbDataAdapter dadapter = new OleDbDataAdapter("Insert into "+tabellenname,con); StringBuilder sb = new StringBuilder(); sb.Append("CREATE TABLE "); sb.Append(tabellenname); sb.Append("("); foreach (DataColumn field in dt.Columns) { sb.AppendFormat(" {0} {1},", field.ColumnName, field.DataType.ToString()); } sb.Append(")"); sb.Replace(",)", ")"); sb.Replace("System.", ""); OleDbCommand cmd = new OleDbCommand(sb.ToString(), con); con.Open(); cmd.ExecuteNonQuery(); dadapter.Update(ds, tabellenname); con.Close(); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 11. September 2007 Teilen Geschrieben 11. September 2007 1. lies die referenz. z.b. OleDbDataAdapter-Klasse (System.Data.OleDb) 2. versuche OLEDB zu verstehen. 3. poste *vernünftige* fehlermeldungen und nicht Das klappt aber irgendwie nicht... OleDbDataAdapter adapter = new OleDbDataAdapter(selectCommand, connection); selectCommand heisst selectCommand, weil hier für ein Update im OleDbDataAdapter zuerst ein SELECT erfolgen muss - sonst würde der DataAdapter ja niemals daten bekommen. s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
zerberos Geschrieben 12. September 2007 Autor Teilen Geschrieben 12. September 2007 ok. Fehlermeldung ist: Aktualisieren: TableMapping oder DataTable kann nicht gefunden werden. hab das umgeändet auf OleDbDataAdapter dadapter = new OleDbDataAdapter("Select * from " + tabellenname, con); dadapter.Update(ds, tabellenname); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Argbeil Geschrieben 16. September 2007 Teilen Geschrieben 16. September 2007 Hi, also folgende Sachen sind mir auf Anhieb aufgefallen: 1. Du machst ein Fill auf ein Dataset und auf ein DataTable, das Dataset kannst du weglassen, du hast die Daten doch bereits geladen. 2. Das Update wird auch wenn die Struktur in Access vorhanden ist nicht funktionieren, der RowState der DataRows in der geladenen Tabelle ist unchanged und daher wird die Row ignoriert. 3. Um die korrekten Datentyp-Bezeichnungen für die Datenbank zu bekommen gibt es für den SQL Server eine Klasse SqlDbType. Ob so etwas für Access existiert weiß ich nicht, wenn nicht müsstest du die selber schreiben. 4. Das mit dem Create ist etwas zu einfach, wenn du die komplette Struktur anlegen willst hast du viel zu tun. Du könntest die Struktur der DataTable analysieren (durch die Coloum Collection laufen), musst aber auch die Einschränkungen der Datenbank kopieren. Wenn die Quelle z.B. varchar(5) war, enthält das Dataset nach dem Fill trotzdem nur einen string-Datentyp, du kannst das Dataset also vergessen um die Tabellenstruktur zu kopieren. Im Prinzip musst du rausfinden wie du bei Oracle die Tabellendefintionen per SQL abrufen kannst. Das Ergebnis muss du auswerten und daraus ein Create-Statement für Access generieren, dabei aber die Datentypen anpassen und Einschränkungen wie PrimaryKeys usw. berücksichtigen. :old Ich würde glatt sagen der Ansatz, hierfür ein Programm zu schreiben ist falsch. Oracle enthält auch ein ETL-Tool mit dem du die Daten bestimmt automatisch in die Access-DB pumpen kannst. Die Frage ist auch: Wozu willst du das überhaupt machen? Wenn du nur die Daten abgreifen und speichern willst kannst du doch auch die WriteXml Methode des Dataset verwenden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.