2016-04-17 26 views
5

Próbuję załadować nowe rozszerzenie json1 gdy połączenie z powołania, ale zachować otrzymujących ten błąd:System.Data.SQLite Nie można załadować modułu

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

Tu jest mój kodu:

SQLiteConnection connection = (SQLiteConnection)session.Connection; 
connection.EnableExtensions(true); 
Assembly assembly = Assembly.Load("System.Data.SQLite"); 
connection.LoadExtension(assembly.Location, "sqlite3_json_init"); 

Używam NHibernate, więc pobieram połączenie z sesji przed wykonaniem jakiejkolwiek logiki.

Czy jest coś, co robię źle? Próbowałem również ładowanie SQLite.Interop.dll, a następnie wywołanie metody sqlite3_json_init i to nadal nie działa.

Zrobiłem to i nadal nie wydają się działać:

 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"); 
       } 

Odpowiedz

2

Wygląda na to, że nie trzeba wprowadzać pełnej ścieżki do pliku interop. Najwyraźniej identyfikuje ona architekturę procesora, z której korzysta, i znajduje plik SQLite.Interop.dll w folderze bin na tej podstawie (bin/x64/SQLite.Interop.dll). Po prostu musiałem dać mu nazwę pliku międzyoperacyjne i to działało:

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

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

Ładowanie rozszerzenie z SQLite.Interop.dll jest poprawny sposób. Więc trzeba po prostu być w stanie wykonać następujące czynności:

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

Przetestowałem to i to działa, więc jeśli nadal masz problem, może trzeba wskazać, jak jesteś coraz ścieżkę współdziałanie plik. Do celów debugowania, może dodać oświadczenie przed LoadExtension, aby upewnić się, że plik interop, który próbujesz załadować, faktycznie istnieje tam, gdzie myślisz, że to robi.

Upewnij się także, że ładujesz poprawną wersję (x86 vs. x64). Jeśli wypróbujesz niewłaściwą wersję, otrzymasz komunikat "Nie można znaleźć określonego modułu". w wywołaniu LoadExtension, nawet jeśli rzeczywiście istnieje.

+0

po prostu przejść na pełną ścieżkę do pliku sqlite.interop, mam edycję powyżej pytanie, aby pokazać jak ja obejmować współdziałanie file –

+0

W tej chwili ustawiam konfigurację kompilacji na Dowolny CPU, czy to może być przyczyną? –

+0

Prawdopodobnie. Istnieją dwie wersje SQLite.Interop.dll, jedna dla wersji 32-bitowej, druga dla wersji 64-bitowej. Musisz załadować właściwy, w zależności od tego, jak działa twoja aplikacja. Upewnij się również, że używasz System.Data.SQLite w wersji 1.0.99.0 lub wyższej (z pasującą biblioteką interopów), ponieważ była to pierwsza wersja obsługująca json1. –

Powiązane problemy