怎么在.NET中安装SQLite provider就不说了。网上一搜一大把。
这里是一篇InfoQ上的文章:SQLite——只要3分钟,你就可以在.NET上创建和运行它
这里只说碰到的两个问题。
建立 SQLiteConnection 时抛出异常 FileLoadException 。具体错误信息为:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。
这是因为.NET Framework 4.0中把版本号全部统一成4.0了,而这个SQLite provider是.NET 2.0的。解决方法也很简单。在app.config的configuration节点下加入以下节点:
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup>
想了解原理的可以去看 这篇文章。
如果你为了图省事不想建立SQLiteConnection,直接建立DataContext,像这样:
var dc = new DataContext(@"data source=your_sqlite_db_path");
那么稍后执行查询的时候,就会出现程序长时间无响应的情况。我想这是因为程序会默认创建 SQLServer 的 connection 而不是 SQLite 的 connection 的缘故。解决方法也很简单。手动建立一个 SQLiteConnection 然后传给 DataContext 就行。像这样:
var conn = new SQLiteConnection(@"data source=your_sqlite_db_path"); var dc = new DataContext(conn);
顺便附上一小段Linq代码,算是备忘:
string dbPath = @"your_sqlite_db_path"; var dc = new DataContext(new SQLiteConnection(dbPath)); Table<User> user = dc.GetTable<User>(); // Linq form // var query = from u in user // where u.Name = "David" // select u; // lambda expression form var query = user.AsQueryable().Where(u => u.Name == "David").Select(u => u); foreach (User u in query) Console.WriteLine("id: {0}, Name: {1}", u.Id, u.Name);
其中User是数据表的实体类。定义如下:
// // table definition // CREATE TABLE users ( // id INTEGER PRIMARY KEY AUTOINCREMENT, // name VARCHAR(30) // ) [Table(Name="users")] class User { [Column(Name="id")] public int Id { get; set; } [Column(Name="name")] public string Name { get; set; } }
搞Rails习惯了,表没有按照SQLServer的那一套命名规则来,所以还需要手动指定表名和字段名。如果表名和字段名都和实体类一样的话,就没必要手动指定映射了。不过Attribute还是要写的。