2011-11-11 4 views
7

Je prévois de faire un projet en utilisant Mono et SQLite comme base de données. Le développement doit être fait principalement sur un Mac. J'ai installé avec succès Mono et testé System.Data.SQLite (dll géré). Les applications de test simples fonctionnent parfaitement.Mono sur OS X: System.Data.SQLite ne fonctionne pas

Toutefois, lorsque j'ai essayé d'utiliser DataTable dans mon code, il génère une exception d'exécution. Voici l'extrait de code:

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

Le code ci-dessus se construit avec succès, mais ne fonctionne pas sur ma machine de développement et donne la sortie suivante sur le terminal.

La sortie quand je lance l'application est comme ci-dessous:

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 

J'ai été surpris de voir que le même exécutable ci-dessus fonctionne parfaitement sous Windows, mais échouait sur ma machine de développement.

En cherchant sur Internet, j'ai trouvé que ce problème devait faire quelque chose avec la bibliothèque dynamique sqlite et devait être compilé avec SQLITE_ENABLE_COLUMN_METADATA. J'ai aussi essayé de compiler sqlite avec SQLITE_ENABLE_COLUMN_METADATA. Je ne sais pas où mettre le compilé libsqlite3.0.dylib.

Toute aide sera appréciée.

+2

Bienvenue à SO! Ceci est une question bien écrite pour un premier demandeur. Je pointe mon bonnet vers toi. – Amy

+0

Hey merci pour l'appréciation lnuyasha. – nayaab

+1

Où avez-vous téléchargé la bibliothèque gérée? J'essaie de trouver un endroit pour le télécharger sur le mac mais n'en trouve pas. –

Répondre

7

Vous devez placer le dylib partout où le mono peut le trouver.

Vous pouvez savoir où mono recherche les bibliothèques natives en faisant ceci:

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

et sortie de consultation verbeux sera imprimé à la borne. Sur mon système mono regarde d'abord dans le répertoire où est l'exécutable, donc mettre le dylib là est probablement le plus facile. Puis mono demande au système de trouver le dylib (en essayant de l'ouvrir sans chemin). Le système recherche généralement dans/usr/lib et peut-être quelques autres endroits (cela dépend bien sûr du système), mais dans tous les cas vous pouvez ajouter un chemin pour que le système regarde en plaçant LD_LIBRARY_PATH dans ce chemin. Dans ce cas, vous allez faire ceci:

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

Qui l'a résolu. J'ai mis le dylib dans/usr/lib et mono l'ai trouvé. Merci Rolf. – nayaab

Questions connexes