2013-05-22 21 views
4

我使用SQLite.Net在Visual Studio中使用控制檯應用程序構建了我的應用程序的核心邏輯,我認爲我只是簡單地將使用語句從Mono.Data.Sqlite.dll與SQLite.Net的兼容

using System.Data.SQLite; 

using Mono.Data.Sqlite.dll 

這個過程完全適用於其它組件工作(Json.Net例如)。

但是我發現兩個Sqlite DLL(SQL和Sql)之間的套管差異。

System.Data.SQLite

SQLiteCommand command = new SQLiteCommand(sql, DbConnection); 
SQLiteDataReader reader = command.ExecuteReader(); 

Mono.Data.Sqlite

SqliteCommand command = new SqliteCommand(sql, DbConnection); 
SqliteDataReader reader = command.ExecuteReader(); 

它很容易與全球發現糾正和替換,但其有點討厭每次我必須在不同環境之間切換。任何人都可以提出解決方案

回答

4

我解決了這個利用第二類抽象的數據庫調用。我有兩個程序集,其中包含一個SQLQuery類的平臺特定版本,其中一個用於windows項目,另一個用於monotouch。

我的數據庫層只是調用SQLQuery所以我的電話都像

SQLQuery q = new SQLQuery("SELECT * FROM foo WHERE bar = @bar"); 
q.AddParameter("bar", bar); 
DataTable dt = q.GetResultsDT(); 

,這將正常工作或平臺上,只要該平臺上爲SQLQuery組裝項目被引用。

1

解決此問題的一種方法是定義項目常量,然後使用#if塊。

你使用:

#if MONO_SQLITE 
using Mono.Data.Sqlite.dll 
#else 
using System.Data.SQLite; 
#endif 

您的代碼:

#if MONO_SQLITE 
    SqliteCommand command = new SqliteCommand(sql, DbConnection); 
    SqliteDataReader reader = command.ExecuteReader(); 
#else 
    SQLiteCommand command = new SQLiteCommand(sql, DbConnection); 
    SQLiteDataReader reader = command.ExecuteReader(); 
#endif 

取決於您是否使用單聲道或.net棧,然後你只需要添加或從項目中刪除MONO_SQLITE常量定義。

Mono C#編譯器還定義了符號__MonoCS__。我不知道是否MonoTouch的這樣做,但如果它沒有,你也可以這樣做:

#if __MonoCS__ 
// ... mono stuff 
#else 
// ... MS stuff 
#endif 
+0

我認爲使用抽象層(即工廠模式)來避免這種情況要好得多。 – boj