Laden...

Typisierter Datenzugriff auf gleichstrukturierte Tabellen

Erstellt von telnet vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.307 Views
T
telnet Themenstarter:in
327 Beiträge seit 2006
vor 12 Jahren
Typisierter Datenzugriff auf gleichstrukturierte Tabellen

Hallo,

ich stehe grade vor folgendem Problem:

In einer MS SQL Server Datenbank existieren mehrere Tabellen, die exakt die gleiche Struktur haben und sich nur im Namen unterscheiden (ja, das muss leider so sein 😉).

Wie setze ich den Zugriff auf diese Tabellen am besten um? Ich könnte mir im Programmcode natürlich die entsprechenden Statements dynamisch zusammenbauen und absetzen (per SqlCommand etc.), allerdings benötige ich typisierten Zugriff auf die Datenelemente.

  1. Gedanke: Stored Procedure mit Tabellennamen als Parameter, SqlString zusammenbauen und mit sp_execsql ausführen. In meiner Anwendung habe ich das ganze dann als generische typisierte Tabelle.

  2. Gedanke: Evtl. typ. DataSet und TableAdapter verwenden, allerdings fällt mir da jetzt nichts ein, wie ich den Tabellennamen in den Adaptern ändern könnte...

  3. Gedanke: Gibts da evtl. Möglichkeiten mit Linq2Sql?

Hat jemand Ideen oder einen Denkanstoß für mich?

3.825 Beiträge seit 2006
vor 12 Jahren

Hallo telnet,

In einer MS SQL Server Datenbank existieren mehrere Tabellen, die exakt die gleiche Struktur haben und sich nur im Namen unterscheiden

das finde ich unerheblich für die Auswahl der Zugriffskomponenten.

Du hast ja schon einige Ideen.

Deinen 1. Gedanken würde ich verwerfen.

Zu 2.: Es würden auch untypisierte DS gehen. Den Tabellennamen gibts Du beim Fill an.

Du kannst ausserdem benutzen :

  • ORM wie z.B. Entity Framework

  • Micro ORM

  • eigene gemappte Klassen

Hängt davon ab was Du machen willst.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

F
10.010 Beiträge seit 2004
vor 12 Jahren

Ich würde hier auch den Weg der MicroORM gehen.

Die benutzen für den Zugriff reines Sql ( PetaPoco hat nen SqlBuilder als hilfe ) um dann Objekte zu destillen.

Man kann also soetwas schreiben


List<Person> list = Mapper.Fetch<Person>("Select Name, Vorname FROM "+TableName );

Oder


List<Person> list = Mapper.Fetch<Person>(Sql.Builder
                .Select("Name", "Vorname")
                .From(TableName)
                .Where("Vorname LIKE @0", "%" + SearchField + "%"));

T
telnet Themenstarter:in
327 Beiträge seit 2006
vor 12 Jahren

Ok danke erst mal für die interessanten Antworten...

Die Sache mit den Micro-ORM hört sich schon mal gut an - das seh ich mir auf jeden Fall an...

Untypisiertes Dataset steht leider nicht zur Debatte...

Eine auf Stored Procedures basierte Lösung zu verwenden wär mir aus Performancegründen eigentlich am liebsten, da die Tabellen relativ schnell mit vielen Daten befüllt werden und ich die I/O so gering wie möglich halten möchte/muss...
Bei den Inserts müssen außerdem noch Einträge in in Beziehung stehenden Tabellen erzeugt werden...

Da müsste ich ja wenn ich keine SPs verwende erst einen Aufruf zum Insert des eigentlichen Datensatzes machen und auf Basis der autogenerierten ID dann n zusätzliche Datensätze in der Zuordnungstabelle erzeugen... Das führt dann zu 1+n Inserts... In einer SP könnte ich das alles direkt nacheinander abwickeln....

Gibt's eine Möglichkeit außer über sp_execsql den Tabellennamen erst beim Aufruf einer SP festzulegen? Oder bliebe als letzter Ausweg (falls das mit dem Micro-ORM nichts ist) nur noch eine SP pro Tabelle anzulegen?

F
10.010 Beiträge seit 2004
vor 12 Jahren

Nein, sql lässt im DML nur Parameter als Variablen zu, weder Tabellennamen noch spalten.

T
telnet Themenstarter:in
327 Beiträge seit 2006
vor 12 Jahren

Hab zwar danach gegoolet aber auch nichts in der Richtung gefunden... wenn ihr das jetzt auch noch sagt, dann lass ich das Suchen bleiben 😉

Dann eben doch eine SP per Tabelle oder MicroORM - da kommt's dann jetzt auf die Performance an....

Danke für eure Hilfe!