簡體   English   中英

OS X上的Mono:System.Data.SQLite不起作用

[英]Mono on OS X: System.Data.SQLite does not work

我打算用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_ENABLE_COLUMN_METADATA編譯sqlite。 我不知道把編譯好的libsqlite3.0.dylib放在libsqlite3.0.dylib

任何幫助將不勝感激。

你需要將dylib放在mono可以找到它的任何地方。

您可以通過執行以下操作找到mono查找本機庫的位置:

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

並且詳細的查找輸出將打印到終端。 在我的系統上,mono首先在可執行文件所在的目錄中查找,因此將dylib放在那里可能是最簡單的。 然后mono要求系統找到dylib(通過嘗試在沒有路徑的情況下打開它)。 系統通常查找/ usr / lib以及其他一些地方(這當然是系統相關的),但無論如何,您可以通過將LD_LIBRARY_PATH設置為該路徑來為系統添加路徑。 在這種情況下,你會這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM