Excel-Tabellen in eine *.mdb kopieren
-
Hallo liebe Gemeinde,
ich habe folgendes Startproblem, bei dem ich eure Hilfe ersuche:
Ich habe eine leere Datenbank, in welche ich sowohl .csv- als auch .xls/x-Dateien einlesen und speichern soll.
Verwenden tu ich System.Data.OleDb um auf die Datenbank zuzugreifen.Kurze Info: Vorher wurden Excel-Dateien eingelesen, verarbeitet und .txt-Dateien erstellt, jetzt - da steigende Datensammlungen - soll eine .mdb bereits gelesene Daten beinhalten (dargestellt in der WinForm in einer Liste per Dateinamen), welche anschließend ausgewählt, in einer "Prioritätenliste" gesammelt und einer bestimmten Priorität zugewiesen werden können.
Mein Denkansatz:
- Es existiert ein Button "Öffne *.xls/x"
- 3 Comboboxen (X,Y,Z,...) werden aktualisiert mit den Spaltennamen (um unwichtige Spalten zu eliminieren)
- Die zugehörigen Spalten werden ausgewählt (also z.B. zu X: Spalte B | Y: Spalte D |...)
- Man klickt einen Button "Excel-Datei in DB einlesen"
(bisher: - Dieser Button liest die Excel-Datei Zeile für Zeile in ein DataSet/DataTable, mit welchem die Daten dann weiterverarbeitet werden)
Problem jetzt: - Dateiname und Daten sollen in der .mdb nach einem genauen Schema hinterlegt werden, um jederzeit abgerufen/ergänzt/gelöscht zu werdenDa ich bisher kaum, um nicht zu sagen, nie, mit Datenbanken gearbeitet habe, könnte mir jemand einen Anstupser in die richtige Richtung geben?
Ich hoffe, ich konnte mein Problem recht klar beschreiben, ansonsten einfach nachfragenSchöne Grüße und Danke im Voraus,
Stryke
-
Gibt es in den Excel-Files immer unterschiedliche Spalten?
D.h. sind das immer unterschiedliche Daten die da drinnen stehen und erfasst werden?
(Also eigentlich geht es nur um die Spalten die dann auch in die DB importiert werden sollen - ob daneben noch weitere Spalten existieren, die dann vielleicht immer unterschiedlich sind, ist eigentlich egal.)
Oder gibt es ein paar wenige (viellicht sogar nur eine) Art von Daten die erfasst werden - mit immer den selben Feldern in den DB?Typischerweise fasst man Daten der gleichen "Art" bei Datenbanken halt in je einer Tabelle zusammen. D.h. wenn du 10 Files einliest die alle "Foo" Datensätze speichern, dann würdest du die "Zeilen" aller 10 "Foo" Files in eine einzige, gemeinsame "Foo" Tabelle schreiben.
Um dann zuordnen zu können aus welchem File eine "Foo" Zeile eingelesen wurde oder ggf. aus welcher Zeilennummer in dem File die Daten kommen kann man dann weitere Felder in der "Foo" Tabelle machen. Da man Datenbanken normalisieren sollte, würde es dann z.B. einen "Foo_Files" Table geben, und im "Foo" Table wird nur der Primärschlüssel der zugehörigen Zeile des "Foo_Files" Tables abgespeichert.
(Der Einfachkeit halber würde ich vorschlagen jeder Tabelle einen sog. "surrogate key" zu verpassen, und diesen als Primärschlüssel zu verwenden. D.h. z.B. einfach ein Auto-Inkrement Integer Feld pro Table (bei MS auch oft als "identity column" bezeichnet) das man als Primary Key verwendet.)Falls du mehrere verschiedene Arten von Daten hast, wirst du natürlich mehrere verschiedene "Foo" Tables brauchen (die dann natürlich nicht alle "Foo" heissen - sondern nach dem benannnt sind was halt darin für Daten gespeichert werden). Dabei kannst du aber vermutlich trotzdem einen gemeinsamen "Foo_Files" Table verwenden - der dann natürlich einen allgemeineren Namen wie "Imported_Files" oder so bekommen sollte.
Falls die Menge an verschiedenen Daten die erfasst werden können nicht vorher bekannt ist wird es etwas komplizierter. Dann müsstest du in dem Programm irgendwie die Möglichkeit schaffen dynamisch neue Tabellen zu erzeugen. Oder als Kompromiss sagen: wenn eine neue Daten-Art dazukommt muss die Tabelle manuell im DB-File angelegt werden, und das Programm entsprechend angepasst.
xStrykex schrieb:
Problem jetzt: - Dateiname und Daten sollen in der .mdb nach einem genauen Schema hinterlegt werden, um jederzeit abgerufen/ergänzt/gelöscht zu werden
Da ich bisher kaum, um nicht zu sagen, nie, mit Datenbanken gearbeitet habe, könnte mir jemand einen Anstupser in die richtige Richtung geben?
Ich hoffe, ich konnte mein Problem recht klar beschreiben, ansonsten einfach nachfragenUff.
Lies dich mal zum Thema Datenbanken allgemein schlau. Also z.B. mal die Normalformen auf Wikipedia durchgucken - also zumindest die 1., 2. und 3. Normalform. Und dann wirst du eine Technologie brauchen um die Daten in die DB zu bekommen bzw. wieder herauszubekommen bzw. modifizieren zu können.
Dazu kannst du grob drei Wege gehen (von stark DB-abhängig/wenig Abstraktion zu wenig DB-abhängig/viel Abstraktion):- Direkt SQL Statements and die DB schicken
- Über die ADO .NET Konstrukte ala DataSet/SqlDataAdapter etc. gehen
- Über LINQ
In eine dieser Technologien wirst du dich einarbeiten müssen. Ich würde (1) oder (3) empfehlen. (2) hat zwar auch bestimmte Vorteile, ist aber mMn. etwas eigen und wird allgemein relativ wenig verwendet - zumindest in den Programmen die ich bisher zu Gesicht bekommen habe.
-
Moin Hustbaer und schonmal vielen Dank,
hustbaer schrieb:
Gibt es in den Excel-Files immer unterschiedliche Spalten?
D.h. sind das immer unterschiedliche Daten die da drinnen stehen und erfasst werden?
(Also eigentlich geht es nur um die Spalten die dann auch in die DB importiert werden sollen - ob daneben noch weitere Spalten existieren, die dann vielleicht immer unterschiedlich sind, ist eigentlich egal.)
Oder gibt es ein paar wenige (viellicht sogar nur eine) Art von Daten die erfasst werden - mit immer den selben Feldern in den DB?Es sind unterschiedliche Excel-Tabellen, die jedoch "gleiche" Daten enthalten, die gespeichert werden sollen, nicht aber die ganze Tabelle, als Beispiel(dick gedruckt die wichtigen Spalten):
Tabelle 1:
XKOR | YKOR | Name | Adresse | ZKORTabelle 2:
Name | Adresse | X | Y | Z | FormatDie Daten, die ich bekomme sind also unterschiedlich gestaltet, weshalb ich in ComboBoxen den Header einlese und die zugehörigen Daten zuordnen kann.
Abgelegt werden sie in der DB dann aber nach einem Schema, also:
DB:
XKOR | YKOR | ZKOR | | Format | InfoSoweit auch so gut, die Daten einzulesen und zu verarbeiten hab ich schon hinbekommen. Jedoch weiss ich nicht, wie man die DB konstruiert/strukturiert.
Nach den Tutorials, die ich jetzt durchgegangen bin, müsste ich dann theoretisch eine Tabelle nach obigem Schema erzeugen (wobei "Info" die Dateinamen enthält) und eine zweite Tabelle, in welcher ich ebenfalls die Excel-Dateinamen abspeicher (PK,FK), wodurch ich die jeweiligen Datensätze aus der "Main-DB" ziehen kann?hustbaer schrieb:
Falls du mehrere verschiedene Arten von Daten hast,...
das kommt eventuell noch, ist aber momentan nicht vonnöten)
hustbaer schrieb:
- Direkt SQL Statements and die DB schicken
- Über die ADO .NET Konstrukte ala DataSet/SqlDataAdapter etc. gehen
- Über LINQ
Sieht so aus, als wenn ich momentan alles nach 2.) mache
aber fange grade an, mich in Linq einzuarbeiten.
Aber von LINQ zu Access (was ich benutzen muss) wird entweder dringendst von abgeraten oder dringendst zu geraten
Muss ich bei LINQ auf irgendetwas Gravierendes achten im Umgang mit Access-Datenbanken?Liebe Grüße,
Stryke