2011-11-11 25 views
7

Ho intenzione di realizzare un progetto utilizzando Mono e SQLite come database. Lo sviluppo deve essere fatto principalmente su un Mac. Ho installato con successo Mono e testato System.Data.SQLite (dll gestito). Le semplici applicazioni di test funzionano perfettamente.Mono su OS X: System.Data.SQLite non funziona

Tuttavia, quando ho provato a utilizzare DataTable nel mio codice, viene generata un'eccezione di runtime. Di seguito è riportato il frammento di codice:

public static void Main (string[] args) 
{ 
    string connectionString = "Data Source=emp.db"; 

    try { 
     using (SQLiteConnection conn = new SQLiteConnection(connectionString)) 
     { 
      string query = "SELECT firstname, lastname FROM employees"; 

      using (SQLiteCommand comm = new SQLiteCommand(query, conn)) 
      { 
       conn.Open(); 

       comm.CommandText = query; 

       using (SQLiteDataReader reader = comm.ExecuteReader()) 
       { 
        while (reader.Read()) 
        { 
         string firstname = reader.GetString(0); 
         string lastname = reader.GetString(1); 
         Console.WriteLine("Name: " + firstname + " " + lastname); 
        } 

        DataTable dt = new DataTable(); 
        dt.Load(reader); // line 39 where problem occurs 
       } 
      } 
     } 
    } catch (Exception e) { 
     Console.WriteLine(e); 
    } 
} 

Il codice di cui sopra vengono costruite con successo ma non funziona sulla mia macchina di sviluppo e fornisce il seguente output sul terminale.

L'uscita quando faccio funzionare l'applicazione è la seguente:

Name: John Doe 
Name: Eric Smith 
System.EntryPointNotFoundException: sqlite3_column_origin_name 
    at (wrapper managed-to-native) System.Data.SQLite.UnsafeNativeMethods:sqlite3_column_origin_name (intptr,int) 
    at System.Data.SQLite.SQLite3.ColumnOriginalName (System.Data.SQLite.SQLiteStatement stmt, Int32 index) [0x00000] in <filename unknown>:0 
    at System.Data.SQLite.SQLiteDataReader.GetSchemaTable (Boolean wantUniqueInfo, Boolean wantDefaultValue) [0x00000] in <filename unknown>:0 
    at System.Data.SQLite.SQLiteDataReader.GetSchemaTable() [0x00000] in <filename unknown>:0 
    at System.Data.Common.DataAdapter.BuildSchema (IDataReader reader, System.Data.DataTable table, SchemaType schemaType, MissingSchemaAction missingSchAction, MissingMappingAction missingMapAction, System.Data.Common.DataTableMappingCollection dtMapping) [0x0003b] in /private/tmp/monobuild/build/BUILD/mono-2.10.6/mcs/class/System.Data/System.Data.Common/DataAdapter.cs:284 
    at System.Data.DataTable.Load (IDataReader reader, LoadOption loadOption) [0x0001f] in /private/tmp/monobuild/build/BUILD/mono-2.10.6/mcs/class/System.Data/System.Data/DataTable.cs:2853 
    at System.Data.DataTable.Load (IDataReader reader) [0x00011] in /private/tmp/monobuild/build/BUILD/mono-2.10.6/mcs/class/System.Data/System.Data/DataTable.cs:2838 
    at SQLiteApp.MainClass.Main (System.String[] args) [0x00086] in /Users/nayaabkhan/Projects/SQLiteApp/SQLiteApp/Main.cs:37 

sono rimasto sorpreso di vedere che lo stesso sopra eseguibile ha funzionato perfettamente sotto le finestre, ma stava venendo a mancare sulla mia macchina di sviluppo.

Cercando su internet, ho scoperto che questo problema deve fare qualcosa con la libreria dinamica sqlite e deve essere compilato con SQLITE_ENABLE_COLUMN_METADATA. Ho provato a compilare sqlite anche con SQLITE_ENABLE_COLUMN_METADATA. Non so dove mettere il compilato libsqlite3.0.dylib.

Qualsiasi aiuto sarà apprezzato.

+2

Benvenuti in SO! Questa è una domanda ben scritta per un principiante. Ti consiglio il mio cofano. – Amy

+0

Hey, grazie per l'apprezzamento lnuyasha. – nayaab

+1

Dove hai scaricato la libreria gestita? Sto cercando di trovare un posto dove scaricarlo sul Mac ma non ne trovo nessuno. –

risposta

7

È necessario inserire il dylib ovunque sia in grado di trovarlo.

Si può scoprire dove mono cerca librerie native in questo modo:

export MONO_LOG_LEVEL=debug 
export MONO_LOG_MASK=dll 
mono yourprogram.exe 

e l'uscita di ricerca dettagliato verrà stampato al terminale. Sul mio sistema, mono guarda prima nella directory in cui si trova l'eseguibile, quindi inserire il dylib è probabilmente il più semplice. Quindi mono chiede al sistema di trovare il dylib (provando ad aprirlo senza un percorso). Il sistema in genere appare in/usr/lib e forse in altri posti (ovviamente dipende dal sistema), ma in ogni caso è possibile aggiungere un percorso per il sistema in cui eseguire l'impostazione impostando LD_LIBRARY_PATH su quel percorso. In questo caso, esegui questa operazione:

export LD_LIBRARY_PATH=/path/to/dylib:$LD_LIBRARY_PATH 
mono yourprogram.exe 
+0

Questo l'ha risolto. Ho messo il dylib in/usr/lib e mono lo ha trovato. Grazie Rolf. – nayaab