SQLite + Azure = Drama?

Ab in die Cloud. Da ist alles besser! Wirklich alles? Hab‘ mich heute etwas länger mit dem Thema beschäftigt, wie man die System.Data.SQLite.dll in Windows Azure nutzen kann. An sich ganz einfach – wenn man das richtige Paket hat.

Auf der offiziellen Seite http://system.data.sqlite.org stehen einem ja unzählige fertige Pakete bereit. Doch welches ist das Richtige?

Ich habe mir die acht aktuellen Binary-Pakete (1.0.81.0, Zips) für das .NET Framework 4 gezogen und das ganze mal ausprobiert. Vier Pakete kann man sofort ausschließen, denn Azure Anwendungen laufen auf einem 64 Bit System. Wenn man also nicht selber ‚rumkonfiguriert‘ scheiden alle Win32 Pakete schon mal aus. Sprich von den acht Paketen bleiben nur noch vier:

Precompiled Binaries for 32-bit Windows (.NET Framework 4.0)
Precompiled Binaries for 32-bit Windows (.NET Framework 4.0) – Bundle
Precompiled Binaries for 64-bit Windows (.NET Framework 4.0)
Precompiled Binaries for 64-bit Windows (.NET Framework 4.0) – Bundle
Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.0)
Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.0) – Bundle
Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 4.0)
Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 4.0) – Bundle

Mein erster Versuch war das ‚Precompiled Binaries for 64-bit Windows (.NET Framework 4.0) – Bundle‘. Leider hat dieses Paket dazu geführt, dass mein kompletter Service nicht mehr erreichbar war. Schaltet man sich per RDP auf den Azure Server und führt dort den dazugehörigen Test aus, erhält man folgenden Fehler: „Failed to find or load the registered .Net Framework Data Provider“.

Versuch zwei war dann ‚Precompiled Binaries for 64-bit Windows (.NET Framework 4.0)‘. Hier gilt es zu beachten, dass man die SQLite.Interop.dll mit ins Azure Package bekommt. (Stichwort: Postbuild-Ereignis). Das Ergebnis war: Service geht. Zugriff auf SQLite schlägt mit folgendem Fehler fehl: „Unable to load DLL ‚SQLite.Interop.DLL'“
Die DLL war natürlich im Verzeichnis vorhanden. Wo liegt also das Problem? Da ich vorher schon relativ viel bei Google unterwegs war, hatte ich schon eine Idee … Wieder per RDP auf den Azure Server und den Dependency Walker gestartet. Prompt bestätigte sich die Vermutung: Die Abhängige Datei ‚msvcr100.dll‘ fehlt. Sorgt man dafür, dass diese Datei auch am Server bereitgestellt wird, dann klappt’s auch mit dem Zugriff.

Hmm. Ein seltsamer Fehler der durch irgendeine DLL plötzlich behoben ist. Vielleicht funktioniert das auch mit dem ersten Paket? Tatsächlich. Kopiert man auch hier die ‚msvcr100.dll‘ ins Verzeichnis verschwindet auch der Fehler „Failed to find or load the registered .Net Framework Data Provider“.

Da ich schon am Server war, habe ich dann auch gleich noch die Tests der letzen beiden Pakete gestartet. Anfangs war ich etwas überrascht, dass beide Pakete auf Anhieb problemlos funktionierten. Wenn man aber mal bei Wikipedia nachliest was eine Static library ausmacht, findet man in der ersten Zeile sinngemäß folgenden Satz:
„… eine Sammlung von Routinen und Funktionen. Die Abhängigkeiten werden beim kompilieren aufgelöst und in die Zieldatei mit eingebunden.“
Ahh, daher kommt hier kein Fehler wegen der ‚msvcr100.dll‘.

Am Ende habe ich dann noch das letzte Paket von der alten SQLite Seite versucht. Die 1.0.66.0 nutzen wir auch noch in einem anderen Projekt. Von daher wollte ich dieser Version auch noch die Gelegenheit geben sich zu beweisen – und siehe da: Funktioniert auf Anhieb.


Zusammengefasst

System.Data.SQlite.dll 1.0.66.0
Precompiled Binaries for 32-bit Windows (.NET Framework 4.0)
Precompiled Binaries for 32-bit Windows (.NET Framework 4.0) – Bundle

Precompiled Binaries for 64-bit Windows (.NET Framework 4.0) (²)
Precompiled Binaries for 64-bit Windows (.NET Framework 4.0) – Bundle (¹,²)

Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.0)
Precompiled Statically-Linked Binaries for 32-bit Windows (.NET Framework 4.0) – Bundle

Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 4.0)
Precompiled Statically-Linked Binaries for 64-bit Windows (.NET Framework 4.0) – Bundle (¹)

(¹), SQLite.Interop.dll nicht vergessen!
(²), msvcr100.dll nicht vergessen!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.