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.
2. Der eigentliche Programmstart erzeugt aus der Struktur der Datenbank ein temporäres Dataset:* Über den DataProvider wird eine Connection zur Datenbank hergestellt.
3. Die Informationen aus diesem temporären Dataset werden automatisch verwendet:* Das Schema wird intern in eine XmlSchema-Klasse umgespeichert.
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.
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.
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.
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.
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
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.
- 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