Hallo,
ich möchte eine Tabelle einlesen, welche verschiedene Datentypen pro Spalte enthaltan kann, z.B. sei folgende Tabelle gegeben:
|Id|Name|ValueInt|ValueDouble|ValueString|ValueDate|...
|1|Peter|123|78.03|Hallo Welt|19.01.2017|...
|2|Hans|789|1.23|Hallo Welt|22.01.2017|...
In einer Konfigurationsmaske soll der Benutzer bereits die Spalten mit den richtigen .NET Datentypen zuweisen und einer DB hinterlegen können, so das beim Einlesen bereits die richtigen Typen (Generic T) hinterlegt werden. Meine Klasse Pro Datensatz sollte wie folgt aussehen:
public class ItemAttribute<T>
{
public string Name { get; set; }
public T Value { get; set; }
}
public class Table
{
public List<ItemAttribute<<???>> Attributes { get; set; }
}
Wie könnte der Aufruf nun realisiert werden?
var dbResult = GetRecordsFromDB();
Table table = new Table();
foreach(var record in dbResult)
{
table.Attributes.Add(new ItemAttribute<record.Datatype>())
}
Schau dir mal eine DataTable an, damit wurde genau das Problem gelöst.
Ich verstehe nicht genau was du hier vorhast.
Willst du hier sowas wie eine dynamische Tabelle realisieren?
Wirst du mit einer relationellen DB so nicht umsetzen können.
Hier muss die Struktur der Tabelle bereits vorgegeben sein und somit auch die Datentypen bekannt sein.
Deine Daten scheinen kein sinnvolles Format zu haben, wenn die Daten in unterscheidlichen Datentypen kommen und deine Benutzer hier scheinbar sich sogar mit Datentypen aus der Programmierung auskennen müssen, genzt auch den Nutzen der Software stark ein.
Ohne den genauen Zweck deiner Umsetzung zu kennen, würde ich auch nicht wissen was du hier genau vorhast.
Der Benutzer sollte in der Regel sich nicht um Datentypen oder dynamische Daten kümmern müssen.
Entsprechend wäre auch mal interessant wer das Tool am Ende zu welchem Zweck verwenden soll.
Was du hier planst dürfte enormer Aufwand sein, desen Nutzen sich mir auch nicht sinnvoll erschließt.
Wenn du erklären kannst, was du damit vor hast, kann man hier vielleicht einen besseren Ansatz liefern.
@Sir Rufus
Würde mich wundern, wenn er "nur" ein DataTable nachprogrammieren wollte.
Klingt für mich nicht so ganz danach auch wenn der Beispiel Code darauf schließen lässt.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
@T-Viro
Ich lese bis jetzt nur dass die Struktur-Informationen der Datei in einer Datenbank hinterlegt werden soll und nicht die Daten aus der Datei damit in die Datenbank geschrieben werden sollen.
So eine Strukturinformation ist problemlos in einer Datenbank abbild- und speicherbar.
Hi #code#,
es gibt noch die Möglichkeit, in der DB jeweils eine Tabelle [Id, Name, Value] für jeden Parameter-Datentyp anzulegen. Dann kann man das Ganze auch mit den geeigneten SQL-Datentypen speichern und dann ganz normal mit OOP verarbeiten oder sogar mit einem ORM-System verwenden.
Weeks of programming can save you hours of planning
Neben den Anmerkungen der anderen hast du noch einen weiteren Denkfehler.
public class Table { public List<ItemAttribute<<???>> Attributes { get; set; } }
Nope, das wird so nicht funktionieren. ItemAttribute<string> ist ein völlig andererer Typ als ItemAttribute<int>.
Beide können nur in einer Collection List<ItemAttribute> gemeinsam gesammelt werden, wenn sie eine gemeinsame nichtgenerische Basisklasse haben. Das heisst, noch einmal deutlich: List<ItemAttribute<???>> geht nicht, nur List<ItemAttribute<string>> oder List<ItemAttribute<int>>, das ist aber beides nicht das, was du möchtest.
Und das wiederum bringt dich beim unboxing in die Situation, dass du wieder am Startpunkt bist und nicht weisst, welcher konkrete Typ und damit welcher generische Parameter benutzt wird. So drehst du dich nur im Kreis.
Die Lösung für das Dilemma besteht aus meiner Sicht, das Schema (die Struktur) in XML zu hinterlegen und daraus zur Laufzeit einen Container zu erstellen, der Zugriff auf eine Sammlung von Objekten bietet, die dem Schema entsprechen. Und, Überraschung! - so etwas gibt es schon und wurde auch schon genannt: DataTable (bzw, genauer: ein typisiertes DataSet). Das muss man nicht mögen (weil es ein ziemliches Codemonster ist), aber letzten Endes bildet es genau ab, was du machen möchtest. ErfinderDesRades hier aus dem Forum hat dazu ein recht eingängiges Tutorial.
Alle anderen Ansätze laufen aus meiner Sicht immer darauf hinaus, die Struktur der Daten in irgendeiner Weise serialisiert zu speichern. Du kannst das auch selbst und schlanker als Dataset implementieren (habe ich auch schon für ein Projekt gemacht), aber Dataset ist erst einmal eine funktionierende Lösung.
Grüße,
LaTino
EDIT: Tags korrigiert
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)