Archiv der Kategorie 'Datenbanken'

NULL-Werte in DropDownList

Eine DropDownList soll dynamisch mit Inhalten aus einer Tabelle (B) gefüllt werden. Der ausgewählte Index soll als Schlüssel in Tabelle (A) eingefügt werden.

Dies realisiert man relativ einfach durch Datenbindung. Dabei wird der SelectedValue des DropDownfeldes mit der Spalte in Tabelle (A) verknüpft:

dropdownlist1.jpg

Als Datenquelle für die Liste im DropDownList wird eine entsprechende DataSource gewählt:

dropdownlist2.jpg

Und schon klappts – Naja fast.

Will man nämlich auch „keinen Wert“ auswählen hat man ein kleines Problem. Denn der Wert „nichts“ (oder NULL) ist in der Tabelle (B) nicht enthalten. Versucht man nun einen Datensatz anzuzeigen, der in Tabelle (A) im Fremdschlüsselfeld den Wert NULL enthält, bekommt man folgenden Fehler:

selectedvalue, das ungültig ist, weil es nicht in der Elementliste vorhanden ist

Da in Tabelle (B) der Wert NULL nicht vorhanden ist, weiß das Programm nicht, welchen Wert es in der DropDownList anzeigen soll (weil es nicht in der Elementliste vorhanden ist). Um dennoch NULL-Werte (also nix) auswählen zu können ist folgende simple Erweiterung des DropDownList erforderlich:

Die Eigenschaft „AppendDataBoundItems“ des DropDownList wird auf True gesetzt. Damit „mischt“ man die statisch eingegebenen Einträge mit denen, die aus der DataSource kommen.

dropdownlist4.jpg

Für den NULL-Wert fügt man nun unter ITEMS einen Leer-Wert hinzu – und fertig ist das Ganze.

dropdownlist5.jpg

Nun besteht die Liste im DropDownList aus den Werten aus der Datenbank und einem einzelnen leeren Wert, den wir manuell hinzugefügt haben.

UNIQUE CONSTRAINT ist nicht CHECK CONSTRAINT

In einer Datenbanktabelle will man manchmal sicherstellen, daß in einer Spalte Werte nicht mehrfach vorkommen, sie also „unique“ sind. Bei einem Primärschlüssel wird dies automatisch durch Definition der Spalte als Primärschlüssel sichergestellt – aber es gibt Fälle, in denen man zwar die Einzigartigkeit der Werte sicherstellen will, aber keinen Primärschlüssel benötigt oder haben mag.

Für diese Fälle gibt es die UNIQUE CONSTRAINT. Will man die jedoch im „Microsoft SQL Server Management Studio (Express)“ definieren, stößt man auf ein kleines Problem: Nirgendwo findet man die Möglichkeit diese UNIQUE CONSTRAINT festzulegen.

Zwar gibt es CONSTRAINTS, doch dahinter verbergen sich sogenannte CHECK CONSTRAINTS. Erst nach einigem herumgesuche wird einem klar: CHECK CONSTRAINTS sind nicht gleich UNIQUE CONSTRAINTS.

Doch des Rätsels Lösung ist – wenn man’s weiß – ganz einfach. CHECK CONSTRAINTS prüfen, ob die gespeicherten Werte bestimmte Bedingungen erfüllen. Also ob z.B. eine Eingabe mindestens aus x Zeichen besteht. Es wird hier also etwas „gecheckt“.

UNIQUE CONSTRAINTS dagegen sind eigentlich so was wie ein Index – und verstecken sich daher auch unter dem Menüpunkt „INDEXES“. Und das ist die erste Gemeinheit: ein UNIQUE CONSTRAINT ist ein Index – kein CONSTRAINT.

Die zweite Gemeinheit: Man kann bei einem Index festlegen, daß er „UNIQUE“ ist. Aber: damit wird es noch lange kein UNIQUE CONSTRAINT. Erst wenn man den Type des Index auf „Unique Key“ setzt – dann hat man endlich eine UNIQUE CONSTRAINT.

uniqueconstraints.jpgUNIQUE CONSTRAINT = UNIQUE KEY INDEX

Es sei noch erwähnt, daß man obige Maske erreicht, wenn man auf der Tabelle rechts klickt und den Punkt „MODIFY“ auswählt. Dann klickt man in der Symbolleiste den Punkt „Manage Indexes an Keys“ an.

Das Ganze geht nicht, wenn man einen bereits bestehenden Index auswählt und sich die Properties anzeigen läßt. Hier gibt es zwar auch einen „Type“ (nämlich Index Type) – doch der bedeutet was anderes.

uniqueconstraints.jpgFalsche Fährte: Index Type ist nicht der Type des Index!

Datenbanken: INSERT-Script generieren einfach gemacht

Da hat man nun eine MS-SQL-Datenbank mit vielen Tabellen und noch mehr Datensätzen und möchte sie gerne weitergeben. Wie geht das?
Nun, da schaut man einfach nach und fragt sich: Wie macht’s Microsoft?

Wer MS-SQL installiert hat kennt auch die Beispieldatenbank „Northwind“. Und wer sie nicht gleich mitinstalliert bekommen hat, findet auf dem Server von Microsoft ein entsprechendes Installations-Script. Da werden die Tabellen mit CREATE erzeugt und die Datensätze mit INSERT eingefügt. Ganz einfach!

Mit dem SQL-Server-Management Tool von Microsoft ist es auch ganz einfach, die CREATE-Statements per Mausklick erzeugen zu lassen: Rechte Maustaste – „Script Database as“ – CREATE. Und fertig ist das CREATE Script.

Nur – es gibt keine Funktion, mit der man auch die INSERT-Befehle generieren könnte, welche die Datensätze in die Tabellen einfügt! Zwar gibt es einen Script-Generator der ein INSERT-Statement erzeugt – jedoch nur das leere Gerüst. Die Daten müßte man manuell eintippeln…

Dazu braucht man ein externes Tool – z.B. SQL Scripter. Das mit .NET geschriebene Programm generiert für jede ausgewählte Tabelle (oder auch für eine individuelle SQL-Abfrage) die entsprechenden INSERT-Statements in T-SQL. Außerdem exportiert es auch Daten nach Text oder CSV. Ganz simple und ganz praktisch!


SQL-Scripter

Das Tool gibt es hier: http://www.sqlscripter.com/
Einfach runterladen, entpacken, starten. Keine Installation erforderlich, nur das Framework muß installiert sein. Solche Tools mag ich, die mir nichts in die Registry reinmüllen und einfach so zu starten sind. Und auch noch tadellos funktionieren.

Das einzige was mich stört: diese Version läuft nur bis Jahresende – dann muß man sich eine neue Version holen. Zwar ist es Freeware – doch wer weiß wie lange noch? Naja…


 

November 2009
M D M D F S S
« Jul    
 1
2345678
9101112131415
16171819202122
23242526272829
30  

Kategorien