Announcement

Collapse
No announcement yet.

Create Table

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Create Table

    Hallo zusammen,

    scheinbar habe ich zu wenig von ADO.NET begriffen. Im Visual Studio gibt es eine mächtige Funktion TypedDataSets zu erzeugen. Mit grafischer Oberfläche und allem SchnickSchnack. Jetzt hatte ich erwartet, dass man das dann irgendwie zur Laufzeit in eine Datenbank packen kann, sprich die Tabellen automatisch generieren kann, z.B. in dem man das zugrundeliegende xsd übergibt oder so etwas. Aber alle Dokumentationen, die ich bis jetzt gefunden habe erzeugen Tabellen durch abfeuern von 'CREATE TABLE bla' via ExecuteNonQuery(), ich finde das relativ archaisch. Zum einen, weil man sich die Arbeit das Modell zu modellieren schon mal gemacht hat und zum anderen, weil man sich beim reimplementieren garantiert Fehler rein macht. Und dann hat man ein TypedDateSet und eine Datenbank, die nicht zu sammenpassen. Hat jemand eine bessere Idee, als das Modell per Hand in 'CREATE TABLE' -Statements umzuwandeln?

    Schönen Gruß

    JSP

  • #2
    Hallo,

    das ist ein sehr komplexes Thema. Eines der Probleme liegt darin, dass für jedes DBMS eigene Verfahren erforderlich sind. Beispiele für Probleme:
    • Unterschiedliche Systemtabellen führen zu unterschiedlichen Verfahren bei GetSchema()
    • Parameter für SQL-Befehle werden unterschiedlich übergeben.
    • Unterschiedliche Datentypen
    • Unterschiede bei der Struktur von SQL-Befehlen

    Zunächst musst Du also sagen, mit welcher Art von DB Du arbeitest.

    Für Firebird (nutzbar vermutlich auch für Interbase) habe ich unter Tool: CreateTypedDataset ein Projekt erstellt. Ich hatte es von vornherein flexibel für andere DBMS konstruiert, aber kein weiteres Interesse erhalten.

    Eine andere Möglichkeit wäre, eine xsd-Datei manuell zu erzeugen und mit xsd.exe daraus ein typ. Dataset zu erstellen. Ich glaube, dass Visual Studio neben dem typ. Dataset auch eine xsd-Datei erzeugt; schau sie doch einmal in einem einfachen Editor an - dann siehst Du, dass das gar nicht so schwer wäre.

    Für weitere (vor allem konkretere) Fragen stehe ich gerne zur Verfügung.

    Viel Erfolg! Jürgen

    Comment


    • #3
      Hallo Jürgen,

      erstmal vielen Dank für die schnelle Antwort. Im Prinzip ist mir klar, dass jede DB ihre eigenen Mechanismen hat, insbesondere, wenn es darum geht Indizes anzulegen und der DB Relationen bekannt zu machen. Da ADO.NET aber eine Abstraktionsschicht darstellt, dachte ich mir halt, dass es dafür auch eine abstrakte Methode gibt.

      Wenn ich eine Applikation schreibe, die auf den Daten arbeitet, dann kann ich die, solange ich keine größeren "Schweinereien" machen, einfach auf eine andere DB portieren, in dem ich einen anderen SubType von IDbConnection instanziere.

      Keine "Schweinereien" impliziert hier zum einen die Verwendung von IDbConnection, IDataAdapter und IDbCommand in der Logikschicht und zwar so, dass bei deren Instanzierung die DB-spezifischen angelegt werden, und natürlich SQL-Standardbefehle.

      Wenn man jetzt einen Art DbTableCreator hätte, dem man irgendwie das sowieso schon völlig MS-spezifische xsd mitgeben könnte, dann würde sich die Anbindung einer neuen DB auf die Protierung der StoredProcedures reduzieren - oder bin ich da jetzt auf dem Holz weg?

      Konkret habe ich eine WebApp, die sowohl mir MS SQLServer, Oracle und SQLite laufen soll und ein entsprechendes Setup mitbringen soll. Jetzt dachte ich mir, dass ich für das Deployment der Tabellen irgendwie direkt auf das Schema zurückgreifen könnte. Dann passen Datenbank und Schema und damit auch die Logik immer zusammen. Ich habe mir jetzt ein paar SQL-Befehle als Ressourcen mit einkompiliert, so dass ich die Tabellen im Bedarfsfall damit anlege. Das ganze ist so simpel, dass diese für alle DBs gleich sind. Den Datenbankzugriff regel ich über eine abstrakte Klasse in der die Methoden

      IsDBNew
      CreateConnection
      CreateAdapter

      überschrieben werden. Das soll auch so bleiben. Was ich aber gerne hätte, wäre eine direkte Kopplung zwischen dem XML-Schema, welches meinem TypedDateSet zugunde liegt, und der CreateTable-Methode.

      Schönen Abend

      JSP

      Comment


      • #4
        Hallo JSP,

        ich weiß nicht, ob das folgende Verfahren Dir hilft; ich habe es in einer ähnlichen Situation vorgeschlagen:
        1. Erzeuge in einer Mini-Applikation aus einem bestehenden typ. Dataset mit WriteXmlSchema() eine xsd-Datei.
        2. Verwende diese als Basis für alle späteren (manuellen) Änderungen.
        3. Erzeuge immer dann, wenn die Tabellenstruktur in der Schema-Datei geändert wird, mit xsd.exe ein neues typ. Dataset.
        4. Das kannst Du dann in der eigentlichen Applikation einbinden und wie gewünscht verarbeiten.
        5. An dieses typ. Dataset kannst Du auch Dein DbTableCreate binden.

        Dadurch, dass es sich um eine partial class handelt und xsd.exe immer nur den Designer-Teil neu erzeugt, bringt das keine Probleme. Tipp: Der Dateiname der Schema-Datei sollte bereits mehrteilig sein, ähnlich wie MyDataset.Designer.xsd.

        Das ist zwar keine automatische Lösung, sollte aber (nach Deinen Erläuterungen) für Dich kein Problem sein.

        Beste Grüße Jürgen

        Comment


        • #5
          Besten Dank

          Hallo Jürgen,

          vielen Dank, so ähnlich habe ich mir jetzt auch beholfen, auch wenn die Marschrichtung bei mir anders herum war, ich habe ja immer das xsd und Änderungen gehen immer von dort aus. Im Prinzip wäre es halt schön so etwas auch im Deploy-Prozess zu haben, dann könnte man z.B. bei eine Upgrade beim Kunden automatisch die richtigen Veränderungen am Datenbankschema einspielen. Aber man kann halt nicht alle haben

          Bin mal gespannt, ob es in der MS Wundertüte dazu irgendwann mal was gibt.

          Schönen Gruß

          JSP

          Comment

          Working...
          X