2011-11-11 19 views
7

Estoy planeando hacer un proyecto usando Mono y SQLite como la base de datos. El desarrollo se debe hacer principalmente en una Mac. He configurado con éxito Mono y probado System.Data.SQLite (dll administrado). Las aplicaciones de prueba simples funcionan perfectamente.Mono en OS X: System.Data.SQLite no funciona

Sin embargo, cuando traté de usar DataTable en mi código, arroja una excepción de tiempo de ejecución. A continuación se muestra el fragmento de código:

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

El código anterior se construyen con éxito pero no se ejecuta en mi máquina de desarrollo y da la siguiente salida en el terminal.

La salida al ejecutar la aplicación es la siguiente:

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 

Me sorprendió ver que el mismo ejecutable anteriormente funcionó a la perfección debajo de las ventanas, pero estaba fallando en mi máquina de desarrollo.

Al buscar en Internet, encontré que este problema tiene que ver con la biblioteca dinámica sqlite y debe compilarse con SQLITE_ENABLE_COLUMN_METADATA. Intenté compilar sqlite con SQLITE_ENABLE_COLUMN_METADATA también. No sé dónde poner el compilado libsqlite3.0.dylib.

Cualquier ayuda será apreciada.

+2

Bienvenido a SO! Esta es una pregunta bien escrita para una persona que pregunta por primera vez. Te ofrezco mi gorro. – Amy

+0

Hola, gracias por tu aprecio lnuyasha. – nayaab

+1

¿Dónde descargó la biblioteca administrada? Estoy tratando de encontrar un lugar para descargarlo en el Mac pero no puedo encontrar ninguno. –

Respuesta

7

Tienes que poner el dylib donde sea que mono pueda encontrarlo.

Puede averiguar dónde mono busca bibliotecas nativas al hacer esto:

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

y la salida verbosa de búsqueda será impreso al terminal. En mi sistema, mono se ve primero en el directorio donde está el ejecutable, así que poner el dylib allí es probablemente el más fácil. Luego mono le pide al sistema que encuentre el dylib (tratando de abrirlo sin una ruta). El sistema generalmente se ve en/usr/lib y tal vez en algunos otros lugares (esto depende del sistema, por supuesto), pero en cualquier caso puede agregar una ruta para que el sistema busque definiendo LD_LIBRARY_PATH para esa ruta. En este caso, hará esto:

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

Eso lo resolvió. Puse el dylib en/usr/lib y mono lo encontró. Gracias Rolf. – nayaab