我使用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();
它很容易通过全局查找和替换来纠正,但每次我在环境之间切换时都有点烦人。有人可以提出解决方案吗?
答案 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