Dienstag, 12. März 2013

Einfaches Arbeiten mit Transaktionen


Eine Transaktion bezeichnet eine Gruppe von Datenbankabfragen, welche nur gemeinsam ausgeführt werden können.

Dieses ist in ganz unterschiedlichen Bereichen wie z.B. in der Lagerlogistik bei einer Lagerumbuchung notwendig.
Wird ein Artikel von einem Lagerplatz auf einen anderen verschoben, so darf zwischen der Entnahme- und der Ziel-Buchung keine Möglichkeit für Eingriffe bestehen.
Ansonsten könnte es zu Problemen kommen und ein Artikel könnte doppelt verbucht werden.

Einfach gesagt, bündeln Transaktionen also nur mehrere SQL-Abfragen.
Eine Transaktion muss immer geöffnet und auch wieder geschlossen werden.

Öffnen kann man eine Transaktion so:
 -- Transaktion starten
 BEGIN TRANSACTION;

Ist eine Transaktion offen, können diverse SQL-Abfragen durchgeführt werden.
Gibt es hierbei keine Fehler, so kann man die Transaktion einfach wie folgt schließen.

-- Transaktion schließen/bestätigen
COMMIT TRANSACTION;

 Erst mit einem COMMIT werden die ausgeführten Abfragen in der Datenbank veröffentlicht.

Gibt es bei der Verarbeitung der beinhalteten SQL-Abfragen Probleme/Fehler, so muss die Transaktion manuell oder automatisch zurückgeschrieben werden. Dabei werden alle durchgeführten Abfragen verworfen.

Das zurückschreiben kann wie folgt durchgeführt werden.

 -- Transaktion rückgängig machen
 ROLLBACK TRANSACTION;

Montag, 11. März 2013

Grundlegende Änderung in diesem Blog

Wer mich kennt, weiß dass ich ursprünglich aus der Microsoft SQL-Server Administration komme.
In den letzten Jahren habe ich diesen Bereich etwas vernachlässigt.
Da mir die Verwaltung sowie die Entwicklung mit dem SQL-Server aber immer (naja eher oft ;-)) sehr viel Freude bereitet hat, möchte ich wenigstens weiterhin darüber bloggen.

Da ich aktuell nur noch wenig gute und vor allem wirklich aktive Blogs zum Thema SQL-Server kenne, möchte ich diesen Blog wieder aktiver nutzen und vor allem das grundlegende Thema ändern.

Es kann zwar durchaus passieren, dass noch einmal ein Post zum Thema .Net/C# rausrutscht.
Das Hauptthema dieses Blogs soll aber zukünftig der Microsoft SQL-Server werden.

Hier möchte ich die Gelegenheit nutzen und noch einmal grundlegende Themen aufarbeiten um spätere Posts auch darauf aufzubauen.

Freitag, 10. August 2012

Entpacken einer MSI-Datei

Wer kennt es nicht? Man benötigt mal schnell eine Datei aus einem MSI-Installationspaket (z.B. die bekannten Telerik-Controls) und möchte dieses aber nicht gleich installieren. Hierfür gibt es eine ganz einfache Lösung.
Mit dem Kommandozeilen-Programm “msiexec” kann man die Dateien eines MSI-Pakets einfach extrahieren. Dieses funktioniert ähnlich wie das Entpacken eines Zip-Archivs.

Der Aufruf des Programms erfolgt wie gesagt ganz einfach in der Konsole wie folgt:
msiexec /a PfadZumMSIFile /qb TARGETDIR=AusgabeVerzeichnis

Das Ausgabeverzeichnis wird automatisch erstellt, wenn es noch nicht vorhanden ist.
Hier mal ein Beispiel, um das Paket “C:\Downloads\RadControls_WinForms.msi” in das Verzeichnis “C:\Entwicklung” zu extrahieren.

msiexec /a C:\Downloads\RadControls_WinForms.msi /qb TARGETDIR=C:\Entwicklung

Donnerstag, 12. April 2012

SQL-Server 2012 Editionsvergleich

Hat man mit den unterschiedlichen Editionen des SQL-Servers zu tun, kann es passieren, dass beim Transferieren einer Datenbank auf einmal bestimmte Funktionen wie zum Beispiel Replikationen oder ähnliches nicht mehr zur Verfügung stehen. Man sollte also vor einer solchen Aktion auch immer einen Blick auf die verwendeten SQL-Server Editionen und deren Features werfen.

Eine gute Übersicht für den neuen SQL-Server 2012 gibt es dazu auf den MSDN-Seiten unter folgendem Link:
Editionsvergleich des SQL-Servers 2012

Freitag, 2. September 2011

Select Top-Rows per SQL

Gerade brauchte ich für einen schnellen Test mal wieder einfach nur ein paar Datensätze aus einer Datenbank.
Die schnellste Art und Weise dieses zu realisieren ist, wenn man einfach nur die ersten x Zeilen ausliest.
Diese könnte man ggf. für bestimmte Auswertungen auch direkt sortiert ausgeben. Aber für meine Tests war das völlig egal.

Da ich ständig mit dem MS SQL-Server arbeite habe ich meine Abfrage wie folgt geschrieben.

-- Rückgabe der ersten 5 Zeilen aus Tabelle1
SELECT TOP 5 * FROM Tabelle1

Bei meinem aktuellen Test habe ich jedoch eine Oracle Datenbank abgefragt.
Nach der Ausführung des oben stehenden SQL-Statements habe ich jedoch folgenden Fehler bekommen.
Error starting at line 1 in command:
SELECT TOP 5 * FROM Tabelle1
Error at Command Line:1 Column:11
Error report:
SQL Error: ORA-00923: Schlüsselwort FROM nicht an erwarteter Stelle gefunden
00923. 00000 -  "FROM keyword not found where expected"
*Cause:   
*Action:

Nach kurzer Überlegung ist es mir direkt wieder eingefallen. Oracle kennt keinen TOP-Befehl.
Dafür gibt es in Oracle-Datenbanken jedoch die Spalte "rownum". Mit dieser kann man dann nicht nur Top-Werte sondern auch ganz bestimmte Datensätze wie folgt ausgeben lassen.

-- Rückgabe der ersten 5 Zeilen aus Tabelle1
SELECT * FROM Tabelle1 WHERE rownum <= 5

-- Rückgabe der Zeilen 6 bis 10 aus Tabelle1
SELECT * FROM Tabelle1 WHERE rownum > 5 AND rownum <= 10

Donnerstag, 11. August 2011

Builderror bei MonoTouch-Projekten mit EGOPhotoViewController

In einem aktuellen MonoTouch-Projekt habe ich für die Anzeige einer Bildergalerie das kleine externe Framework EGOPhotoView/EGOPhotoViewController eingebunden. Nach der Implementierung konnte ich das Projekt nicht mehr kompilieren. Es kam im Output immer folgender Fehler:

Undefined symbols:
"__Unwind_Resume", referenced from:
+[EGOCache currentCache] in libPhotoViewerKitMobile.a(EGOCache.o)
-[EGOCache saveCacheDictionary] in libPhotoViewerKitMobile.a(EGOCache.o)
+[EGOImageLoader sharedImageLoader] in libPhotoViewerKitMobile.a(EGOImageLoader.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
Process exited with code 1, command:

Abhilfe hat hier folgende Einstellung geschaffen:
- Projekteigenschaften öffnen
- Build => IPhone Build auswählen
- Im Reiter "General" die "Additional mtouch arguments" erweitern um -gcc_flags "-cxx -lgcc_eh"

Tipp:
Um erweiterte Ausgabemeldungen (Output) zu bekommen, muss man einfach in die arguments noch die Parameter -v -v -v aufnehmen.

Mittwoch, 10. August 2011

Zufalls-Datensätze direkt per SQL auslesen

Manchmal benötigt man schnell und einfach einen einzelnen, beliebigen Datensatz aus einer Datenbank/Tabelle. Wo mir dieses bislang sehr nützlich erschien, war zum Beispiel beim Einlesen von Zufallsbildern auf mobilen Geräten. Um hier keinen unnötigen Overhead wie das Erstellen von Objekt-Id-Listen zu erzeugen, ist es manchmal hilfreich einfach nur einen Zufallswert direkt aus der Datenbank geliefert zu bekommen. Dieses kann man ganz einfach wie folgt realisieren.

MS-SQL-Server:
SELECT TOP 1 * FROM Testtabelle
ORDER BY NEWID();

SQLite:
SELECT * FROM Testtabelle ORDER BY RANDOM() LIMIT 1;