Mono在OS X: System.Data.SQLite不工作
本文关键字:Data SQLite 工作 System OS Mono | 更新日期: 2023-09-27 18:14:03
我计划使用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
放在哪里。
您需要将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