Database-Generator

    • VB.NET

    Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von MrTrebron.

      Database-Generator

      Anbei ein Gerät, das ein typisiertes Dataset einlesen kann daraus eine zum Dataset passende Datenbank generieren.
      Ich empfehle ja immer, eine Anwendung erstmal ohne Datenbank auszuprogrammieren, und erst wenn soweit featurecomplete, eine DB zu hinterlegen, um noch den "letzten Rest" zu implementieren, der ohne DB halt nicht machbar ist (wie Multi-User-Unterstützung oder gezielter Abruf von nur Teil-Daten).
      Eine verfrühte DB-Integration vervielfacht die Komplexität der ganzen Entwicklung, und wenn ungeschickt angefangen, verbaut man sich u.U. auch noch alle Möglichkeiten von Databinding.
      Aber wenn man dann am Punkt ist, wo die DB drangemacht wird, kann man hiermit zig Tabellen und hunderte von Spalten sich erstmal raushauen lassen - nacharbeiten, mit dem für die DB vorgesehenen Datenbank-Frontend kann man immer noch.
      Oder auch, ums mal gesehen zu haben - für viele ists wohl ein ungutes Gefühl, sich fett in die Entwicklung zu stürzen, ohne die Frage des letztendlichen DB-Zugriffs auch nur grob geklärt zu wissen.

      Jedenfalls das Proggi arbeitet bischen wie die Connectoren, die von verschiedenen DB-Anbietern bereitgestellt werden, nur in die annere Richtung: Also ein Connector generiert aus einer DB ein typDataset - DBGenerator aber generiert aus dem Dataset die DB :D.
      Dabei unterstützt es vom Prinzip her alle .Net-tauglichen Datenbank-Systeme, also MySql, SqlServer, SqLite, SqlServerCe, Access, Oracle. Weil eine DB, von der man das Schema abrufen kann, an die kann man auch die CREATE TABLE - Commands in geeigneter Weise schicken, dass das Ding hinterher mit dem Dataset zusammenpasst.

      Begriffe: Ich werfe folgende Begriffe vermutlich unrichtiger weise durcheinander: Provider, Datenbank-System (DBS), Sql-Dialekt. Ich weiß nicht den Unterschied zw. DBS und Provider, jedenfalls scheinen diese 3 Begriffe 1:1 miteinander zusammenzuhängen: 1 Provider, 1 DBS, 1 Sql-Dialekt.

      Paar Bildle
      Beispiel-Generierung

      Die rote Markierung zeigt ein Problem an - nämlich hier scheitert die Generierung, denn im Dataset wird offensichtlich eine Spalte mit Datentyp Char verwendet, wofür im Schema des SqlCe-DBS kein Mapping angegeben ist. Im Video wird gezeigt, wie man das ausbessert, indem man einfach ein benutzerdefiniertes Mapping hinzufügt.

      DatabaseViewer

      Damit kann man in der DB herumstöbern, zB was für Datentypen die hat, und auf welchen Framework-Datentyp die Mappen (Spalten #1 und #5). Aber auch alles mögliche annere kann man in Augenschein nehmen.

      Provider-Settings

      DbGenerator ruft vonne DB das Schema ab, und ordnet es einem Provider zu. Dann muss man einige Festlegungen treffen, die die Spezifika dieses Providers betreffen:
      • FileExtension: Bei dateibasierten Providern ordnet DbGenerator anhand dieser Angabe den Provider zu (war zu faul, das per Registry zu machen)

      • Quotes: verschiedene Sql-Dialekte haben verschiedene Quote-Identifier, also Zeichen, mit denen DB-Objekte wie Tabellen und Spalten eindeutig als DB-Objekte gekennzeichnet werden, um Verwechslungen mit Schlüsselworten auszuschließen, zB: [Update] <> Update - das linke wäre ein SqlCe-DB-Objekt, das rechte ist ein Schlüsselwort.

      • AutoIncrement: Jeder Dialekt hat eine eigene Syntax, um Auto-Increment-Spalten zu definieren. Bei manchen - wie Access - ist Counter ein eigener Datentyp, bei anderen, wie SqlCe kann man einen geeigneten Datentyp angeben (meist int oder BigInt), und qualifizieren mit "Identity" und sogar noch 2 Parametern für Startwert und Schrittweite. In meiner Eingabe dafür stellt '?' einen Platzhalter für den Datentyp dar, der dann aus der AutoIncrement-Spalte des zu migrierenden Datasets ausgelesen wird.

      • ConnectionPattern: DbGenerator speichert hier eine Vorgabe für dateibasierte DBS, sodass er, wenn eine Datei eingegeben wird, den ConnectionString sich selbst ausdenken kann. Hierbei ist '?' der Platzhalter, an dem DbGenerator den übergebenen Dateipfad einsetzt.
        Im einzelnen Migrations-Projekt (s. Abb. "PersonBerufProject.Png", Grid#1) kann der Connectionstring immer noch individuell geändert werden - der Connection-Pattern ist nur die Voreinstellung.

      • Mappings: Hier sind die vom DBS unterstützten Datentypen gelistet, gruppiert nach den .Net-Datentypen, die man darauf mappen kann. Kann ein .Net-Typ auf mehrere DbTypen mappen, so wird beim autom. Generieren das "Preferred" Mapping vorgezogen - ist aber im konkreten Projekt auch individuell änderbar.
        Wie man sieht, erfordern einige DbTypen die Angabe von Parametern - auch hier kann man die Voreinstellungen anpassen.
        Insgesamt sind im Mapping-View editierbare Felder hellblau gekennzeichnet.


      wichtiger Hinweis von @Arby:: Eigentlich ists nicht korrekt, den Providern spezifische Syntax zuzuordnen, denn man kann etwa mit dem OleDb-Provider ebensogut auch SqlServer abfragen. Und dann failt die Syntax, die dort eigentlich für Access hinterlegt ist.
      Ich entscheide aber zunächst mal, es trotzdem dabei zu belassen, und empfehle, beim Einsatz vom DbGenerator halt die spezifischen DbProvider zu verwenden, also: SqlServer -> SqlClient, SQLite -> SQLite, MySql -> MySqlClient.

      Wo lerne ich Sql-Syntax?
      W3Schools: SQL Tutorial ist die beste Sql-Doku, die mir bekannt ist's - damit kann man sich auf jeden Fall erfolgreich durchkämpfen.
      W3Schools wird betrieben vom W3-Konsortium, also was renomierteres gibts einfach nicht, wage ich zu behaupten.

      Zum Abschluss
      Fast wie ein "Mini-Universal-Datenbank-Management-System": Man kann egal für welche Datenbank sein relationales Datenmodell grafisch unterstützt im Dataset-Designer des VisualStudio gestalten (und sogar schon voll funktionsfähige Anwendungen damit entwickeln) - bei Bedarf haut DbGenerator die Datenbank dazu raus :D

      Leider musste ich feststellen, dass SqLite zumindest auf meinem System nur bis Framework-Version FW3.5 unterstützt wird. Ich habe zwar eine neuere Dll auch eingebunden, aber da zickt VisualStudio rum.
      Vielleicht hätte ich auch nur was installieren müssen - da hab ich aber keine Lust zu.

      Dafür hat sich SqlCe verbessert: Die 3.5-Version hat noch kein Schema bereitgestellt, aber Version 4.0 läuft wunderbar - siehe mein Video.

      letzte Links
      Mir fällt auf, dass ich hier pausenlos von typisiertem Dataset rede, aber möglicherweise ist vielen gar nicht bekannt, wie in .Net Datenbanken, typisiertes Dataset und databinding-getriebene Oberflächen-Entwicklung miteinander verzahnt sind:
      Also vier Views-Videos und weiterführende Links geben glaub eine umfassende Einführung in diese Programmier-Welt, DBExtensions handeln die Daten-Zugriffs-Schicht ein für allemal ab, jedenfalls in ziemlich großem Umfang.

      Das Video
      Zeigt (etwas hastig), wie man eine Dataset-Only-Anwendung in 10 Minuten in eine SqlCe-DB-Anwendung migriert.
      Inklusive der Anpassung eines Char-Mappings für den SqlCe-Provider, sowie Transfer der Daten aus der Xml-Datei in die DB.

      2 kl. Korrekturen zum Film
      1. Im Film erzähle ich, das DB-Schema sei Grundlage für die DB-Extensions. Ist natürlich Quark - richtig ist, dass das DB-Schema Grundlage des DbGenerators ist - nicht der DbExtensions
      2. Im Film erkläre ich den 'n'-Prefix des nchar()-Db-Datentyps falsch, und das richtige ist eiglich recht interessant:
        Bei Sql-Datentypen sind 2 Prefixe üblich, nämlich 'n' und 'var'.
        • 'n' wird auf Chars angewendet, und heißt "national", und meint einen unicode-Char-Typ, also einen mit doppelter Breite, der daher jegliche Sonderzeichen und Kram fassen kann - mit nchar() ist man also auf der sicheren Seite
        • 'var' bedeutet "variable Länge". char(50) ist also immer 50 Zeichen breit, varchar(50) ist maximal 50 Zeichen breit.
          Die betreffenden Datentypen heissen: char(), varchar(), nchar(), nvarchar(), byte(), varbyte()



      Lizenz: Beerware
      Dateien

      Dieser Beitrag wurde bereits 21 mal editiert, zuletzt von „ErfinderDesRades“ ()

      ErfinderDesRades schrieb:

      Hier kann der User einstellen, wie sein Db-Provider es haben will.

      Damit hab ich ehrlich gesagt ein Problem, denn nach meiner Erfahrung ist es nicht der .NET Datenprovider, der bestimmt, wie die SQL-Syntax aussehen muss, sondern der eigentliche Treiber dahinter bzw. die Datenbankengine. Gehst du über den OleDb-Provider, bestimmt der OleDb-Treiber der jeweiligen Datenbank, wie Quote-Zeichen und Autowert-Spalten definiert sind. Einfaches Beispiel zum ausprobieren: Geh mit System.Data.OleDb einmal auf eine Access-Db (ConnectionString "Provider=Microsoft.Jet.OLEDB.4.0;...") und einmal auf eine SQLServer-DB ("Provider=SQLOLEDB;..."), dann wirst du bereits merken, dass es da Unterschiede gibt.

      Was die Quotezeichen angeht, gibt es auch hierzu Informationen in den Metadaten der Datenbank, die man über da Framework abfragen kann (DbConnection.GetSchema("DataSourceInformation")), in dieser Tabelle gibt es eine Zeile, die das "QuotedIdentifierPattern" des Datenbanktreibers definiert. Das ist ein regulärer Ausdruck, mit dem ich z.B. leider nur hinbekomme, einen Bezeichner auf Gültigkeit zu überprüfen, unabhängig davon ob er Quotezeichen enthält oder nicht, nicht aber um daraus die korrekten Quotezeichen herauszufiltern. Ich weiß nichtmal ob man das sicher aus dem regulären Ausdruck programmatisch ableiten kann. Aber man könnte einfach einen beliebigen Bezeichner in [] setzen, mit der RegEx prüfen und wenns nicht "matcht", stattdessen die Backticks nehmen.
      Weltherrschaft erlangen: 1%
      Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
      Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
      Danke.
      Jo stimmt. Also ich nahm naiv an, dass OleDB mit Access verheiratet ist, SqlClient mit SqlServer, SqLite mit SqLite, MySqlClient mit MySql, und OracleClient mit Oracle - was ich glaub üblicherweise auch so gehandhabt wird - aber nicht muß.
      Werd ich mich demnächst drum kümmern. Arbeitsfähig ist das Tool ja trotzdem.
      Naja - mal sehen :(.
      Weil ist mir schon wichtig, dasses für den User einfach ist, und das würde halt weitere Komplexität reinbringen, dasser nun zur Datebank nicht nur den Provider aussuchen muß, sondern zusätzlich die Sql-Syntax.
      Muss ich glatt mal probieren, ob man wirklich mit OleDb aufm SqlServer rumorgeln kann, oder gar auf SqLite.

      Vlt. kriege ich ja hin, diese Dinge automatisch anhand des ConnectionStrings vor-einzustellen, sodass der User immer noch bei Sonderwünschen abwandeln kann...

      ErfinderDesRades schrieb:

      Muss ich glatt mal probieren, ob man wirklich mit OleDb aufm SqlServer rumorgeln kann, oder gar auf SqLite.

      Mit OleDb kann man auf so ziemlich jeder Datenbank rumorgeln, schließlich ist OleDb die Technologie, mit der man vor ADO.NET - also mit dem alten ADO (ActiveX Data Objects) ausschließlich auf allen möglichen Datenbanken rumhantierte...
      Weltherrschaft erlangen: 1%
      Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
      Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
      Danke.

      ErfinderDesRades schrieb:

      W3Schools wird betrieben vom W3-Konsortium, also was renomierteres gibts einfach nicht, wage ich zu behaupten.


      Sorry aber da liegst du falsch:
      Siehe: About W3Schools

      The site derives its name from the World Wide Web (W3), but is not affiliated with the W3C.

      W3Schools was originally created in 1998, by Refsnes Data, a Norwegian software development and consulting company.

      [/quote]
      Die deutsche Sprache ist Freeware, du kannst sie benutzen, ohne dafür zu bezahlen. Sie ist aber nicht Open Source, also darfst du sie nicht verändern, wie es dir gerade passt.