Suche: ADO.NET

Aufzählungswert per Zeichenkette ermitteln 👍 👎

Vor sehr langer Zeit habe ich bereits einen Artikel zu Enumerationen in C# geschrieben, an welchen ich indirekt anknüpfen möchte. Oftmals steht man im Bereich der Softwareentwicklung vor dem Problem der Interoperabilität, da mehrere – bisweilen äußerst unterschiedliche – Systeme zusammenarbeiten müssen.

Ein klassischer Fall im Bereich der Webentwicklung ist die Zusammenarbeit aus Anwendung und Datenbank, beispielsweise hier im Blog zwischen der Programmiersprache C# mit ASP.NET MVC-Framework und MySQL-Datenbank. Etwas konkreter soll es darum gehen, C#-Aufzählungstypen zusammen mit MySQL-ENUMs zu verwenden, welche grundsätzlich erst einmal als bloße Zeichenketten zu behandeln sind. Für das folgende Beispiel nehmen wir an, dass eine Tabelle user existiert, die eine Spalte state vom Typ ENUM('ACTIVE','INACTIVE','LOCKED') enthält.

Unter Verwendung des ADO.NET Entity Framework würde beim Database First-Ansatz eine entsprechende Klasse user mit der Eigenschaft state vom Typ string erzeugt. Da es sich um eine partielle Klasse handelt, erweitern wir diese um eine neue Eigenschaft State. Diese soll anschließend die automatische Konvertierung für state übernehmen und ermöglicht uns im Programmcode einen typsicheren Zugriff auf den Status des Benutzers:
Aufzählungstyp UserState anlegen
0102030405
public enum UserState {    Active,    Inactive,    Locked}
Erweiterung der Klasse user
010203040506070809
public partial class user {    public UserState State {        get {            return (UserState) Enum.Parse(typeof(UserState), this.state, true);        }        set {            this.state = value.ToString().ToUpper();        }    }
Die Verwendung gestaltet sich nun – mit beiden Eigenschaften – wie gewohnt komfortabel:
Verwendung
0102030405060708091011121314151617
user dbUser = new user() {    State = UserState.Active};  // üblicherweise aus Datenbank ermittelt

string state = dbUser.state; // "ACTIVE"UserState userState = dbUser.State; // Active
dbUser.State = UserState.Inactive;

state = dbUser.state; // "INACTIVE"userState = dbUser.State; // Inactive
dbUser.state = "LOCKED";

state = dbUser.state; // "LOCKED"userState = dbUser.State; // Locked
Weitere Informationen zu den Enum.Parse-Methoden finden sich wie üblich im MSDN. Es lohnt sich außerdem ein Blick auf die Enum.TryParse(…)-Methoden mit generischem Typ-Parameter.

Städteportal umfangreich erweitert 👍 👎

In letzter Zeit war es hier etwas ruhiger im Blog. Das liegt einerseits daran, dass ich beruflich recht eingespannt bin und andererseits daran, dass ich ein den meisten regelmäßigen Besuchern dieser Webpräsenz sicherlich bereits bekanntes Projekt stark erweitert habe: Mein Portal für die beiden Stadtstaaten Berlin und Hamburg.

Ich erlaube mir demnach eine kleine zusätzliche Werbung dafür und fasse ein paar Neuerungen kurz zusammen:
  • Bahnhöfe besitzen nun die Information,
    • ob sie sich ober-/unterirdisch befinden,
    • in welchem Tarifbereich sie sich befinden
    • und ob sie barrierefrei erreichbar sind.
  • Einige dutzend Bezirkszuordnungen wurden erfasst oder präzisiert.
  • Über hundert neue Geo-Koordinaten wurden erfasst und mehrere dutzend Wikipedia-Artikel ergänzt.
  • Es können Entfernungsberechnungen auf Basis der Koordinaten (per Orthodrome) durchgeführt werden.
  • Es existieren jeweils zusätzlich separate RSS-Feeds für Berlin und Hamburg.
  • Es existiert ein (Veranstaltungs-)Kalender mit Feiertagen.
  • Es existiert ein neuer Abschnitt für Parkanlagen.
  • Es existiert ein neuer Abschnitt für das aktuelle Wetter mit Vorhersage (per wetter.com).
Darüber hinaus wurde der SOAP-Webservice freigeschaltet, welcher die meisten Daten und Zuordnungen für eigene Anwendungen zur Verfügung stellt. Es gibt dazu eine Dokumentation und Beispiele für C# und PHP.

Für Interessierte sei zum Schluss auch noch erwähnt, dass das gesamte Portal ebenso wie diese Webpräsenz hier auf ASP.NET MVC mit C# basiert. Der Zugriff auf die Datenbank erfolgt per ADO.NET Entity Framework mit LINQ.

Partielle Klassen in C# 👍 👎

C# unterstützt sogenannte partielle Klassen, welche es ermöglichen, eine Klasse auf verschiedene Dateien verteilt zu definieren. Diese werden bei der Kompilierung zu einer einzelnen Klasse zusammengeführt, so als wäre sie wie eine "normale" Klasse in einer Datei definiert worden. Insbesondere ist also auch dateiübergreifend Zugriff auf private Mitglieder (Eigenschaften, Methoden etc.) einer Klasse möglich.

Wir wollen dies wie üblich an einem (kleinen) Beispiel konkretisieren und legen dazu einfach die Eigenschaften und Methoden einer Klasse in zwei verschiedenen Dateien ab:
Klasse "Person" in Datei "Person.cs"
01020304050607080910111213141516
public partial class Person {    public Person(string firstName, string lastName) {        this.FirstName = firstName;        this.LastName = lastName;    }
// Partner liefern public Person GetPartner() { // z. B. aus Datenbank auslesen }
// Kinder liefern public List<Person> GetChildren() { // z. B. aus Datenbank auslesen }}
Klasse "Person" in Datei "Person.Properties.cs"
01020304050607080910111213141516
public partial class Person {    public string FirstName {        get;        set;    }
public string LastName { get; set; }
public int Age { get; set; }}
Zugegeben: Es ist fraglich, ob dieses Vorgehen – insbesondere in diesem trivialen Beispiel – überhaupt sinnvoll ist. Andererseits ergibt sich für den Aufrufer/Verwender der Klasse keinerlei Unterschied zur Definition in einer Datei, da letztlich eine einzige Klasse herauskommt. Insofern ist dem Entwickler (bzw. den Richtlinien des Teams) überlassen, ob und ggf. wie man damit umgehen möchte. Die Verwendung erfolgt jedenfalls ganz wie gewohnt:
Anwendung der partiell definierten Klasse
010203
Person ich = new Person("Holger", "Stehle") {    Age = 24};
Ein großer Vorteil ergibt sich jedoch bei der Verwendung von Code-Generatoren. Der generierte Code definiert dabei partielle Klassen. Diese können nun in einer eigenen Datei erweitert werden, ohne Gefahr zu laufen, bei einer neuen automatischen Codegenerierung alle Anpassungen zu verlieren. Visual Studio selbst setzt auf derartiges Vorgehen z. B. im Zusammenhang mit ADO.NET Entity Framework oder grafischen Benutzeroberflächen (vgl. "*.Designer.cs"-Dateien).

Andere Einsatzmöglichkeiten wären die übersichtliche Arbeit verschiedener Entwickler an einer umfangreicheren Klasse oder das Anbieten einer Anwendung mit verschiedenen Ausprägungen der Funktionalität einer Klasse, indem nur spezifische Dateien der partiellen Klasse kompiliert werden.

Mit der praktischen kleinen Erweiterung NestIn für Visual Studio (nicht Express) könnt ihr im Übrigen mit wenigen Mausklicks auch dafür sorgen, dass die Dateien wie aus der Entwicklungsumgebung bekannt verschachtelt dargestellt werden, was meiner Ansicht nach deutlich zur Übersicht beiträgt.

Willkommen auf meiner persönlichen Webpräsenz 👍 👎

Nachdem ich seit Jahren nur mehr diverse Projektseiten betreibe habe ich mich spontan dazu entschieden, mir auch wieder eine persönliche Seite zu erstellen. Ihr findet hier einige Informationen zu meiner Person, meiner Tätigkeit, meinen Projekten und ein paar weitere Sachen, die ich erwähnenswert finde.

Passend zu meiner kleinen Seite habe ich dazu diesen Blog erstellt, in dem ich vorhabe, hin und wieder ein paar Dinge loszuwerden. In welche Richtung sich das Ganze entwickelt und wie oft ich dazu kommen werde, etwas zu schreiben, kann ich leider noch nicht genau sagen. Auf jeden Fall werden die Themen Softwareentwicklung und Technik im Allgemeinen nicht zu kurz kommen. Aber auch ein paar Gedanken zu aktuellen Entwicklungen der Gesellschaft dürften ihren Platz finden. Ich würde mich auf jeden Fall über Leser und Kommentare freuen. Sehr gerne könnt ihr mir auch Vorschläge zu möglichen Themen, die euch evtl. interessieren, zukommen lassen.

Für die Technik-Interessierten: Diese Webpräsenz basiert auf ASP.NET MVC (Razor) mit C# und verwendet eine MySQL-Datenbank, auf die per ADO.NET Entity Framework und LINQ zugegriffen wird. Ausgeliefert wird schließlich alles per IIS unter Windows Server 2012 R2.

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche