2011-11-11 5 views
7

MonoとSQLiteをデータベースとして使用してプロジェクトを行う予定です。開発は主にMacで行われます。私は正常にセットアップモノとSystem.Data.SQLite(管理されたDLL)をテストしました。シンプルなテストアプリケーションは完全に機能します。Mono on OS X:System.Data.SQLiteが機能しません

私のコードで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をどこに置くべきかわからない。

ご協力いただければ幸いです。

+2

ようこそ!これは最初の尋問者のためのよく書かれた質問です。私はあなたにボンネットをヒントする。 – Amy

+0

ありがとう、感謝のためにlnuyasha。 – nayaab

+1

管理対象ライブラリはどこからダウンロードしましたか?私はそれをMacでダウンロードする場所を見つけることを試みているが、何も見つけることができない。 –

答えて

7

モノはどこでも見つけることができます。

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

をして冗長なルックアップ出力端子に出力されます:

あなたはモノがこれを行うことにより、ネイティブライブラリを検索する場所を見つけることができます。私のシステムでは、モノは最初に実行可能ファイルがあるディレクトリを調べるので、おそらく最も簡単です。次にmonoはシステムにdylib(パスなしでオープンしようとする)を探すように要求します。システムは通常、/ usr/libとおそらく他の場所を調べます(これはもちろんシステムに依存します)。しかし、LD_LIBRARY_PATHをそのパスに設定することで、システムのパスを追加することができます。この場合は次のようにします:

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

それがそれを解決しました。私は/ usr/libにdylibを置いてモノを見つけました。 Rolfに感謝します。 – nayaab

関連する問題