.NET Framework 4.0 安装SQLite Provider碰到的一些问题

怎么在.NET中安装SQLite provider就不说了。网上一搜一大把。

这里是一篇InfoQ上的文章:SQLite——只要3分钟,你就可以在.NET上创建和运行它

这里只说碰到的两个问题。

1. 连接数据库时出现错误 -- 混合模式程序集是针对“v2.0.50727”版的运行时生成的……

建立 SQLiteConnection 时抛出异常 FileLoadException 。具体错误信息为:混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集

这是因为.NET Framework 4.0中把版本号全部统一成4.0了,而这个SQLite provider是.NET 2.0的。解决方法也很简单。在app.config的configuration节点下加入以下节点:

1 <startup useLegacyV2RuntimeActivationPolicy="true">
2 <supportedRuntime version="v4.0"/>
3  </startup>

想了解原理的可以去看 这篇文章

2. 使用DataContext对象(Linq的用法)连接数据库,长时间程序无响应

如果你为了图省事不想建立SQLiteConnection,直接建立DataContext,像这样:

C#代码
1 var dc = new DataContext(@"data source=your_sqlite_db_path");

那么稍后执行查询的时候,就会出现程序长时间无响应的情况。我想这是因为程序会默认创建 SQLServer 的 connection 而不是 SQLite 的 connection 的缘故。解决方法也很简单。手动建立一个 SQLiteConnection 然后传给 DataContext 就行。像这样:

1 var conn = new SQLiteConnection(@"data source=your_sqlite_db_path");
2 var dc = new DataContext(conn);

顺便附上一小段Linq代码,算是备忘:

C#代码
1 string dbPath = @"your_sqlite_db_path";
2 var dc = new DataContext(new SQLiteConnection(dbPath));
3
4 Table<User> user = dc.GetTable<User>();
5
6  // Linq form
7  // var query = from u in user
8  // where u.Name = "David"
9  // select u;
10
11 // lambda expression form
12 var query = user.AsQueryable().Where(u => u.Name == "David").Select(u => u);
13
14 foreach (User u in query)
15 Console.WriteLine("id: {0}, Name: {1}", u.Id, u.Name);

其中User是数据表的实体类。定义如下:

C#代码
1 // // table definition
2 // CREATE TABLE users (
3 // id INTEGER PRIMARY KEY AUTOINCREMENT,
4 // name VARCHAR(30)
5 // )
6
7 [Table(Name="users")]
8 class User
9 {
10 [Column(Name="id")]
11 public int Id { get; set; }
12
13 [Column(Name="name")]
14 public string Name { get; set; }
15 }

忘记文章出自哪里了……

posted on 2011-04-12 14:24  Osiris4Net  阅读(1881)  评论(0编辑  收藏  举报

导航