Zum Inhalt springen

C# daten in access db schreiben


Empfohlene Beiträge

Geschrieben

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.
Geschrieben

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...

Geschrieben

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.

Geschrieben

@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!

Geschrieben

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();  

Geschrieben
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)...

Geschrieben

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.

Geschrieben

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

Geschrieben

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();

Geschrieben

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

Geschrieben

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);

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...