2016-04-17 11 views
5

Ich versuche, die neue json1 Erweiterung zu laden, wenn die Verbindung in einzurichten, aber ich halte diesen Fehler empfangen:System.Data.SQLite Erweiterung kann nicht laden

SQL logic error or missing database
The specified procedure could not be found.

Hier mein Code:

Ich verwende NHibernate, also nehme ich einfach die Verbindung aus der Sitzung, bevor irgendeine Logik ausgeführt wird.

Gibt es etwas, was ich falsch mache? Ich habe auch versucht, SQLite.Interop.dll zu laden und dann die sqlite3_json_init Methode aufzurufen, und das funktioniert immer noch nicht.

Ich tat dies und es scheint noch nicht zu funktionieren: von SQLite.Interop.dll

 SQLiteConnection connection = (SQLiteConnection)session.Connection; 
       connection.EnableExtensions(true); 
       string path = "F:\\GitHub\\ExampleProj\\lib\\sqlite\\SQLite.Interop.dll"; 
       if (File.Exists(path)) 
       { 
        connection.LoadExtension(path, 
"sqlite3_json_init"); 
       } 

Antwort

2

Es sieht tatsächlich so aus, als müssten Sie nicht den vollständigen Pfad zur Interop-Datei eingeben. Offensichtlich identifiziert es die verwendete Prozessorarchitektur und findet die SQLite.Interop.dll-Datei im darauf basierenden bin-Ordner (bin/x64/SQLite.Interop.dll). Ich hatte gerade den Namen der Interop-Datei zu geben, und es funktionierte:

SQLiteConnection connection = (SQLiteConnection)sender; 
       connection.EnableExtensions(true); 

       connection.LoadExtension("SQLite.Interop.dll", "sqlite3_json_init"); 
3

Laden der Erweiterung der richtige Weg ist. So sollten Sie nur in der Lage sein, Folgendes zu tun:

connection.EnableExtensions(true); 
connection.LoadExtension(@"full\path\to\SQLite.Interop.dll", "sqlite3_json_init"); 

ich dies habe getestet und es funktioniert, wenn Sie also nach wie vor ein Problem haben, können Sie angeben müssen, können, wie Sie den Pfad des Interop sind immer Datei. Fügen Sie zu Debugging-Zwecken möglicherweise eine Assertion vor LoadExtension hinzu, um sicherzustellen, dass die Interop-Datei, die Sie laden möchten, tatsächlich dort existiert, wo Sie sie zu haben glauben.

Stellen Sie außerdem sicher, dass Sie die richtige Version (x86 vs. x64) laden. Wenn Sie die falsche Version versuchen, erhalten Sie: "Das angegebene Modul wurde nicht gefunden." auf dem LoadExtension-Aufruf, auch wenn es tatsächlich dort ist.

+0

ich in den vollständigen Pfad zum sqlite.interop Datei nur passieren, ich habe die Bearbeitung der Frage oben zu zeigen, wie ich die Interop umfassen Datei –

+0

Momentan setze ich die Build-Konfiguration auf Any CPU, könnte das der Grund sein? –

+0

Möglicherweise. Es gibt zwei Versionen der SQLite.Interop.dll, eine für 32bit, eine für 64bit. Je nachdem, wie Ihre Anwendung läuft, müssen Sie die richtige laden. Stellen Sie außerdem sicher, dass Sie System.Data.SQLite Version 1.0.99.0 oder höher (mit passender Interop-Bibliothek) verwenden, da dies die erste war, die json1 unterstützte. –

Verwandte Themen