2011-11-11 31 views
7

Tôi đang lên kế hoạch thực hiện một dự án bằng cách sử dụng Mono và SQLite làm cơ sở dữ liệu. Phát triển sẽ được thực hiện chủ yếu trên máy Mac. Tôi đã thiết lập thành công Mono và kiểm tra System.Data.SQLite (dll quản lý). Các ứng dụng thử nghiệm đơn giản hoạt động hoàn hảo.Mono trên OS X: System.Data.SQLite không hoạt động

Tuy nhiên, khi tôi cố gắng sử dụng DataTable trong mã của mình, nó sẽ ném ngoại lệ thời gian chạy. Sau đây là đoạn mã:

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

Mã trên được tạo thành công nhưng không chạy trên máy phát triển của tôi và cung cấp đầu ra sau trên thiết bị đầu cuối.

Sản lượng khi tôi chạy các ứng dụng như sau:

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 

Tôi rất ngạc nhiên khi thấy rằng cùng thực thi trên làm việc hoàn hảo dưới cửa sổ, nhưng đã thất bại trên máy phát triển của tôi.

Tìm kiếm trên internet, tôi thấy rằng vấn đề này phải làm điều gì đó với thư viện động sqlite và phải được biên dịch bằng SQLITE_ENABLE_COLUMN_METADATA. Tôi đã cố gắng biên dịch sqlite với SQLITE_ENABLE_COLUMN_METADATA. Tôi không biết nơi để đặt các biên dịch libsqlite3.0.dylib.

Mọi trợ giúp sẽ được đánh giá cao.

+2

Chào mừng bạn đến với SO! Đây là câu hỏi được viết tốt cho người hỏi lần đầu. Tôi tip nắp ca-pô của tôi cho bạn. – Amy

+0

Xin cảm ơn vì đã đánh giá cao lnuyasha. – nayaab

+1

Bạn đã tải xuống thư viện được quản lý ở đâu? Tôi đang cố gắng tìm một nơi để tải xuống trên máy Mac nhưng không thể tìm thấy bất kỳ địa điểm nào. –

Trả lời

7

Bạn cần đặt dylib ở bất kỳ đâu có thể tìm thấy nó.

Bạn có thể tìm ra nơi mono trông cho các thư viện bản địa bằng cách làm này:

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

và đầu ra tra cứu tiết sẽ được in vào thiết bị đầu cuối. Trên hệ thống mono của tôi trông đầu tiên trong thư mục nơi thực thi được, do đó, đặt dylib có lẽ là dễ nhất. Sau đó, mono yêu cầu hệ thống tìm dylib (bằng cách cố gắng mở nó mà không có đường dẫn). Hệ thống thường nhìn vào/usr/lib và có thể một vài nơi khác (điều này tất nhiên là phụ thuộc vào hệ thống), nhưng trong mọi trường hợp, bạn có thể thêm đường dẫn cho hệ thống xem bằng cách đặt LD_LIBRARY_PATH thành đường dẫn đó. Trong trường hợp này, bạn sẽ làm điều này:

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

Điều đó đã giải quyết được. Tôi đặt dylib trong/usr/lib và mono tìm thấy nó. Cảm ơn Rolf. – nayaab

Các vấn đề liên quan