OS X上的Mono:System.Data.SQLite不起作用
我打算用Mono和SQLite作为数据库来做一个项目。 开发主要在Mac上完成。 我已成功设置Mono并测试了System.Data.SQLite(托管dll)。 简单的测试应用程序完美运
但是,当我尝试在我的代码中使用DataTable
,它会抛出运行时exception。 以下是代码段:
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 :0 at System.Data.SQLite.SQLiteDataReader.GetSchemaTable (Boolean wantUniqueInfo, Boolean wantDefaultValue) [0x00000] in :0 at System.Data.SQLite.SQLiteDataReader.GetSchemaTable () [0x00000] in :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