[英]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.