Mono на OS X: System.Data.SQLite не работает - PullRequest
7 голосов
/ 11 ноября 2011

Я планирую сделать проект, используя Mono и SQLite в качестве базы данных. Разработка должна осуществляться в основном на Mac. Я успешно настроил Mono и протестировал System.Data.SQLite (управляемый dll). Простые тестовые приложения работают отлично.

Однако, когда я пытался использовать DataTable в своем коде, он выдает исключение времени выполнения. Ниже приведен фрагмент кода:

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

Приведенный выше код успешно собран, но не запускается на моем компьютере разработчика и выдает следующий вывод на терминале.

Вывод при запуске приложения следующий:

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

Я был удивлен, увидев, что тот же вышеупомянутый исполняемый файл прекрасно работал под Windows, но не работал на моей машине для разработки.

Выполняя поиск в Интернете, я обнаружил, что эта проблема связана с динамической библиотекой sqlite и должна быть скомпилирована с SQLITE_ENABLE_COLUMN_METADATA. Я также попытался скомпилировать sqlite с SQLITE_ENABLE_COLUMN_METADATA. Я не знаю, куда положить скомпилированный libsqlite3.0.dylib.

Любая помощь будет оценена.

1 Ответ

7 голосов
/ 11 ноября 2011

Вам нужно поместить dylib в любое место, где моно может его найти.

Вы можете узнать, где моно ищет нативные библиотеки, выполнив следующее:

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

и вывод подробного поиска будетраспечатан на терминал.В моей системе mono сначала смотрит в каталог, где находится исполняемый файл, поэтому поместить туда dylib, вероятно, проще всего.Затем моно просит систему найти дизлиб (пытаясь открыть его без пути).Система обычно ищет в / usr / lib и, возможно, в нескольких других местах (это, конечно, зависит от системы), но в любом случае вы можете добавить путь для поиска в системе, задав LD_LIBRARY_PATH для этого пути.В этом случае вы сделаете это:

export LD_LIBRARY_PATH=/path/to/dylib:$LD_LIBRARY_PATH
mono yourprogram.exe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...