Mono.Data.Sqlite.dll与SQLite.Net的兼容性

时间:2013-05-22 12:47:25

标签: sqlite xamarin.ios xamarin

我使用SQLite.Net在Visual Studio中使用控制台应用程序为我的应用程序构建了核心逻辑,我以为我只是可以从

中切换出using语句
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(); 

它很容易通过全局查找和替换来纠正,但每次我在环境之间切换时都有点烦人。有人可以提出解决方案吗?

2 个答案:

答案 0 :(得分:4)

我通过使用第二个类来抽象数据库调用来解决这个问题。我有两个包含SQLQuery类的平台特定版本的程序集,一个用于Windows项目,另一个用于单点触控。

我的数据库层只调用SQLQuery,因此我的调用类似于

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

这将适用于任一平台,只要在项目中引用该平台的SQLQuery程序集即可。

答案 1 :(得分: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

根据您使用的是Mono还是.Net堆栈,您只需在项目中添加或删除MONO_SQLITE常量定义。

Mono C#编译器还定义了符号__MonoCS__。我不知道MonoTouch是否会这样做,但如果确实如此,你也可以这样做:

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