Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Tool: CreateTypedDataset
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3358
Herkunft: Berlin

Themenstarter:

Tool: CreateTypedDataset

beantworten | zitieren | melden

Die Applikation CreateTypedDataset erledigt das, was ihr Name sagt:

1. Im Formular werden alle benötigten Informationen zusammengestellt:
  • Im Formular werden eine Datenbank und ein Provider (für DbProviderFactory) ausgewählt.
  • Dazu gibt es die Parameter für den ConnectionString.
  • Außerdem werden alle Angaben für das gewünschte Dataset festgelegt; dabei handelt es sich im Wesentlichen um die Parameter, die das NET-Tool Xsd.exe benötigt.
  • Zusätzlich kann festgelegt werden, ob die Bezeichner von Tabellen, Feldern und Constraints aus der Schreibweise der Datenbank (z.B. nur Großbuchstaben) in eine gemischte Schreibweise konvertiert werden sollen.
  • Für wiederholte Verwendung werden alle diese Angaben in einem Dataset Configuration bearbeitet und in der Datei CreateTypedDataset.Ini (im Xml-Format) gespeichert.
2. Der eigentliche Programmstart erzeugt aus der Struktur der Datenbank ein temporäres Dataset:
  • Über den DataProvider wird eine Connection zur Datenbank hergestellt.
  • Über DB-spezifische SELECTs werden Tabellen und Feldnamen geholt und in ein Dataset eingetragen.
  • Zu jedem Feld werden in diesem Dataset weitere Informationen - max. Feldlänge bei Strings, nullable - registriert.
  • Alle PrimaryKeys, UniqueKeys und Relations (ForeignKeys) werden in diesem Dataset registriert.
  • Alle Bezeichner werden, soweit gewünscht, in 'gemischte' Schreibweise konvertiert.
3. Die Informationen aus diesem temporären Dataset werden automatisch verwendet:
  • Das Schema wird intern in eine XmlSchema-Klasse umgespeichert.
  • Informationen, die WriteXmlSchema() nicht überträgt, werden manuell als Attribute nachgetragen.
  • Das in dieser Weise geänderte Schema wird als xsd-Datei gespeichert.
  • Das Programm holt sich aus der Registry den Pfad zum NET-SDK-Tool xsd.exe, übergibt die erforderlichen Parameter und erzeugt damit die gewünschte Quelldatei.
Das Programm läuft ruck-zuck: Eine lokale Datenbank mit 8 Tabellen, 50 Feldern und
18 Constraints benötigt eine Sekunde oder weniger.

Zielgruppe

Das Programm liefert Unterstützung bei der Programmentwicklung mit typisierten Datasets immer dann, wenn solche Hilfe in der IDE oder bei bestimmten Datenbanken nicht genügt:
  • Delphi erzeugt keine typisierten Datasets.
  • VS-Express oder #D binden nur wenige DB-Provider ein.
  • Firebird-Provider o.a. können z.T. höchstens mit Klimmzügen genutzt werden.
Struktur des Programms

Das Programm wurde mit #D erstellt. Die Erläuterungen habe ich als Kommentar in die AssemblyInfo.cs eingetragen. Dort steht auch, wie ich die Programmlogik auf die einzelnen Dateien aufgeteilt habe.

Hinweise und Fragen

Mich interessiert weiterhin, ob es Interesse an einem solchen Programm gibt.

Für Firebird 2.0 habe ich das Programm erstellt; es funktioniert. Für Firebird 1.5 oder Interbase habe ich nichts getestet. Da die DB-internen Bezeichner sich nicht geändert haben, spricht alles dafür, dass es (einen geeigneten Provider vorausgesetzt) dafür ebenfalls funktioniert.

Für andere DB-Systeme fehlt mir selbst die Notwendigkeit. Wer dafür Interesse hat, muss lediglich eine spezielle Klasse ableiten. Dies gilt zunächst für MS-SQL (hier ist vielleicht zwischen den Versionen zu unterscheiden) und Oracle sowie vermutlich Access; ich bitte um entsprechende Berichte.

Bei anderen ODBC- oder OleDB-Systemen bin ich mir vollkommen unklar darüber, ob und ggf. wie dieses Verfahren genutzt werden kann. Auch hier bitte ich um Meldung über Interesse oder Informationen.

Datentypen werden nicht immer korrekt zwischen Datenbank und Dataset übertragen. Bei Firebird sind mir folgende "Unverträglichkeiten" bekannt:
  • Date, Time und Timestamp werden einheitlich zu DateTime. Ich finde (noch) keinen Weg, wie ein Time-Feld "ohne Datum" zu verarbeiten wäre.
  • Boolean gibt es zwar im Prinzip. Hier handelt es sich aber eigentlich nur um eine Domain auf Smallint (mit den Werten 0 und 1); ich habe noch nicht untersucht, wie sich Programm und typisierte Datasets bei "Boolean" verhalten.

    Zeichensätze: Bisher habe ich nur Datenbanken mit ISO8859_1 bearbeitet. Ich weiß noch nicht, wie andere Zeichensätze - insbesondere UNICODE_FSS - zu behandeln sind.

    Das Programm wurde unter NET 2.0 erstellt und kann (wegen der DbProviderFactory-Klasse) unter NET 1.1 nicht zum Laufen gebracht werden. Da sich die Struktur der Dataset-Klasse nicht geändert hat, dürfte ein so erzeugtes typisiertes Dataset problemlos von einer NET 1.1-Applikation genutzt werden können.

    Datenbindung im Formular nur provisorisch: Damit habe ich bisher noch keine Erfahrung. Deshalb habe ich Dataset, BindingSource und DataBindung der Controls nicht sauber verarbeitet, sondern mich zunächst einmal darauf gestürzt, dass alles so läuft wie gewünscht. Ich vermute sehr stark, dass man an diesen Stellen noch einiges verbessern kann.

    Auf Check-Constraints und DefaultValue verzichte ich, weil es dazu zu viele Varianten gibt.

    Ich bitte um Antworten, ob dieses Werkzeug hilfreich ist. Danke vielmals! Jürgen

    Nachtrag 1: einen Schreibfehler berichtigt, eine Exception durch vorherige Prüfung ersetzt
    Nachtrag 2: AutoIncrement und minOccurs als Attribute korrekt eingefügt.
  • Attachments
    private Nachricht | Beiträge des Benutzers
    juetho
    myCSharp.de - Member



    Dabei seit:
    Beiträge: 3358
    Herkunft: Berlin

    Themenstarter:

    Problem bei der Nutzung des Dataset

    beantworten | zitieren | melden

    Hallo,

    Dieser Beitrag ist durch die Version vom 16.11.2006 nicht mehr von Bedeutung.

    leider habe ich ein verstecktes Problem gefunden. Bisher habe ich noch nicht die richtige Idee gehabt, wo der Fehler sitzt und wie ich ihn umgehen oder beseitigen könnte. Da ich nicht abschätzen kann, wie lange das dauert, setze ich diese Fehlermeldung als eigenen Beitrag hierher.

    Verletzung mindestens einer Constraint durch mindestens einen Datensatz

    Wenn ich in der eigentlichen Anwendung das erzeugte typ. Dataset einbinde und mit dem DataAdapter per Select Daten in das Dataset einlese, bekomme ich eine solche Exception; nach meinen bisherigen Versuchen bezieht sie sich auf ForeignKeys (allerdings nicht auf alle).

    Ich habe noch nicht alles geprüft und probiert, aber:

    Wahrscheinliche Ursache: AllowDBNull = false muss ggf. richtig gesetzt werden

    Diesen Wert, den ich aus der DB hole, muss ich über minOccurs="1" in die xsd-Datei übertragen; das macht WriteXmlSchema() leider nicht selbst.

    Alles geklärt? Das weiß ich noch nicht. Auf jeden Fall muss ich nach einem einfachen und sicheren Weg suchen, das Attribut minOccurs richtig zu setzen. Außerdem muss ich endgültig feststellen, wie alle Exceptions vermieden werden.

    Ich bitte deshalb zunächst um etwas Geduld oder um hilfreiche Nachricht, wenn Ihr Diskrepanzen zwischen einer Datenbank-Struktur, der xsd-Datei und dem erzeugten Dataset feststellt.

    Gruß Jürgen

    Dieser Beitrag ist durch die Version vom 16.11.2006 nicht mehr von Bedeutung.
    private Nachricht | Beiträge des Benutzers
    juetho
    myCSharp.de - Member



    Dabei seit:
    Beiträge: 3358
    Herkunft: Berlin

    Themenstarter:

    CreateTypedDataset Version 1.0

    beantworten | zitieren | melden

    So, die erste Version ist jetzt sinnvoll abgeschlossen. Die Beschreibung geht aus dem ersten Beitrag hervor.

    Attribute AutoIncrement und AllowDBNull/minOccurs

    Diese werden jetzt direkt aus dem Dataset ausgewertet und korrekt in XmlSchema als Attribute eingetragen.

    Offenes Problem: Verletzung der Eindeutigkeitsregeln

    Dieses Problem kann zz. nicht gelöst werden, da Datenbanken und NET teilweise unterschiedlich arbeiten. Beispiel mit "groß" und "gross":
    • Diese sind bei Firebird verschiedene Einträge.
    • Aber bei NET werden sie als gleich sortiert.

    Wenn ein UNIQUE-Constraint (z.B. ein PrimaryKey) auf einem solchen Feld angelegt wird, können solche Werte in der Datenbank gespeichert werden, aber beim Laden der Daten in das Dataset gibt es eine entsprechende Exception.

    Eine Lösung wäre nur dadurch zu erreichen, dass COLLATION und CultureInfo für jede Tabelle und jedes Feld übertragen werden. Ich halte es für unangemessen, dies generell im Tool zu regeln, und verzichte deshalb darauf.

    Offenes Problem: Check-Constraints und DefaultValue

    Auf die Prüfung solcher Eigenschaften der Datenbanken verzichte ich, weil es dazu zu viele Varianten (abhängig von den Datentypen und den Programmierer-Gewohnheiten) gibt.

    Die aktuelle Version steht im Beitrag 1 zum Download bereit.

    Weitere Informationen und Änderungen werde ich nur noch bereitstellen, wenn ich Rückmeldungen erhalte.

    Gruß und viel Erfolg! Jürgen
    private Nachricht | Beiträge des Benutzers
    DetlefM
    myCSharp.de - Member



    Dabei seit:
    Beiträge: 1

    Tool: CreateTypedDataset

    beantworten | zitieren | melden

    Habe es noch nicht ausprobiert - scheint aber die Antwort auf ein Problem von mir zu sein. Wie erstelle ich portable DataSets (die Entwicklung mit einem DataSet in Verbindung mit SQL Express machen und dann auf MS SQL Mobile umstellen - oder Oracle).
    Danke.
    private Nachricht | Beiträge des Benutzers
    juetho
    myCSharp.de - Member



    Dabei seit:
    Beiträge: 3358
    Herkunft: Berlin

    Themenstarter:

    beantworten | zitieren | melden

    Zitat von DetlefM
    - scheint aber die Antwort auf ein Problem von mir zu sein. Wie erstelle ich portable DataSets
    Dabei hilft mein Projekt eher nicht. Suche lieber nach Stichworten wie "O/R Mapper" oder "Providerunabhängigkeit". Ich hatte das zwar als Grundgedanke berücksichtigt; aber mir ging es darum, von der DB-Struktur aus das typ. Dataset zu erzeugen. Das erledigt für MS-SQL eine der Visual Studio-Versionen einfacher. Jürgen
    private Nachricht | Beiträge des Benutzers