Linq To Sqlite 一一二二
说在前头
之所以写下这些文字,主要是因为使用LINQ的同志们都觉它的美好(至于有多美好,各位心里知道,我就不在描述了,如果你是你还不了解LINQ,园子里有大把的文章),微软老哥只提供了自家的SQLServer的支持 -LinqToSql ,然而很多项目,特别是小型的项目,部署SQLServer太过于麻烦(光下载就够呛),Sqlite、Access就成很多人的选择,但又不想去写那“红通通”(VS中字符串的颜色)的SQL语句,于是祭出了Google大神,发现伙伴们常用的是Dblinq,但配置让很多新手有点伤神(至少那个每次要用 DbMetal.exe命令生成对象就有点……,反正我是比较懒),收费的就不用说了(我们这一行的,口袋都有点紧……)。
进入正题
这里主要是介绍使用Linq To DB,它相对现在已有的方案来说,用法是比较简单的。下面我们就开始吧!
1、打开VS,新建一个项目(我建的是Winform)并保存,名称随意;
2、安装Nuget的Linq to SQLite包,打开Nuget包管理器控制台(VS 菜单 “工具”-->库程序包管理器-->库程序包管理器控制台)如下图;
Nuget是什么?
没有它时,我们引用一些开源的库至少需要做如的一些事:
a、找到正确的资源(库文件及其依赖项);
b、下载相应的资源(有下错及别欺骗过的经历没?);
c、添加引用;
很长一段时间,大伙儿一直重复着这样的折腾,终于有一伙人受不了拉,于是Nuget诞生了,好东西微软肯定是不放过,于是VS里集成了;

3、在PM>提示符后输入命令:(请保持网络畅通,下边命令要联网下载)
Install-Package linq2db.SQLite
4、完装完成后,自动添加了依赖项:System.Data.SQLite、linq2db、ling2db.t4models(创建Linq to SQLite的T4模板)
在解决方案资源管理器中添加了几项(是不是帮你把原来要自己做的事代劳了?,世界一下子变得美好了),如图:

5、打开解决方案资源管理器中LinqTODB.Template文件夹中的CopyMe.SQLite.tt.txt文件,如图:

图中红框依次为下面生成类文件的,命名空间,数据库目录,数据库名称 (请更改为你自己的命名空间,数据库名目录,数据库名,上图是我测试项目使用的,否则无法正常继续)。
注意:如果数据库有密码且是用“SQLite2009 Pro”创建的,密码类型请选择第三项 RSA(Compatible with ADO.NET Provider),否则打不开数据库,会一直提示“File is encrypted or is not a database”
6、将后面的.TXT去掉,保存,此时会提示,是否执行,点是。就会在此文件同目录下生成一个类文件(后面程序中会用到)如图:

7、现在就可以使用Linq To Sqlite了;
var db = new DatabaseHelper1DB(@"Data Source=F:\Yun\VolcanoCloudTest\DatabaseHelper2.db3;Version=3;Password=1");
var temp =
from c in db.Users
select c;
foreach (var c in temp)
listBox1.Items.Add(c.Name);
但是很遗憾,一个异常出来了,是说连接数符串没有定义。原来生成类中的DatabaseHelper1DB构造函数<public DatabaseHelper1DB(string configuration)>的字符串类型的参数是连接字符串配置文件中Name,不是连接字符串本身。我不想去配置连接字符串,因为多数时间(至少我是这样)连接字符串是代码动态生成的。办法总是有的,我们来看看DatabaseHelper1DB的基类 LinqToDB.Data.DataConnection ,它有一个这样的构造函数:
public DataConnection(IDataProvider dataProvider, string connectionString);
第二参数正是我们想要的连接字符串本身,问题是第一个参数怎么传入,派生类的代码又是自动生成的。怎么办呢?方法有二
a、修改生成后的类文件为:
public DatabaseHelper1DB(string configuration)
:base(configuration) //原来的
{
InitDataContext();
} public DatabaseHelper1DB(string configuration)
:base(new LinqToDB.DataProvider.SQLite.SQLiteDataProvider(), configuration) //修改后的
{
InitDataContext();
}
但这样有一个问题,代码每生成一次,我都要修改一次,不省心呀(觉得不省心的,请看第二种)
b、修改代码生成模板,这样一劳永逸。找到文件“LinqToDB.ttinclude”进行如下修改:
if (GenerateConstructors)
{
if (DefaultConfiguration == null)
DataContextObject.Members.Add(new Method(null, DataContextObject.Name, new string[], new[] { "InitDataContext();" }));
else
DataContextObject.Members.Add(new Method(null, DataContextObject.Name, new string[], new[] { "InitDataContext();" }) { AfterSignature = { ": base(\"" + DefaultConfiguration + "\")" } });
DataContextObject.Members.Add(new Method(null, DataContextObject.Name, new[] { "string configuration" }, new[] { "InitDataContext();" }) { AfterSignature = { ":base(new LinqToDB.DataProvider.SQLite.SQLiteDataProvider(), configuration)" } });
//上面的 ":base(new LinqToDB.DataProvider.SQLite.SQLiteDataProvider(),configuration)为修改后的 DataContextObject.Members.Add(new MemberGroup
{
IsCompact = true,
Members = { new Method("void", "InitDataContext") { AccessModifier = AccessModifier.Partial } }
});
}
再次运行,异常没有了。(如果你觉得这样麻烦,或是你习惯于配置里设置连接字符串的方式,你只要在配置 文件中增加连接字符串,并在使用时传入配置项的Name);
完事了? 慢!不要太高兴,查询是可以了,更新,删除呢?DatabaseHelper1DB 里没有提供相应的方法,难道这东东只支持查询,于是祭出google,开始一阵眩晕,看了一篇老外介绍 linq to db的文章,说linq to db 技术是一种linq查询解决方案。我的天,查询?!,难道真不支持,折腾了这么久就只能查询,怎么对得住自己呢?自已实现?应该不会不支持,老外做事还是细致的。提供一个库,不至于只做到一半。于是继续搜索,看了好些英文博客(那个痛苦呀,本人英文不好,你懂的)。终于找到了,原来linq to db是通过扩展方法来实现更新和删除的,而相关的扩展方法又在另外的命名空间(LinqToDB下,不是DatabaseHelper1DB类所在的命外空间 LinToSqlite),因此要引入命名空间。
using LinqToDB;
插入:
User uNew = new User();
uNew.Name = "test";
uNew.Password = "";
db.Insert(uNew);
更新:
using (var db = new DatabaseHelper1DB(@"Data Source=F:\Yun\VolcanoCloudTest\DatabaseHelper2.db3;Version=3;Password=1"))
{
db.Users
.Where(u => u.ID == )
.Set(p => p.Name,"test")
.Update();
}
删除:
using (var db = new DatabaseHelper1DB(@"Data Source=F:\Yun\VolcanoCloudTest\DatabaseHelper2.db3;Version=3;Password=1"))
{
db.Users
.Where(u => u.ID == )
.Delete();
}
另外,linqtodb还支持access(看到很多同志在找 linq to access,有人还用上收费的,这可能又是一福音)等十余中数据库,使用方法类似,本文已经很长了(我喜欢简短的文章,阅读方便),所以不在赘述,想要用的同志就自己动手吧。
末了
本文是我在园子里的第一篇(处女作),希望大家多指正,如果能帮上你,我表示灰常灰常的高兴。 2015年1月6日于图书馆。
Linq To Sqlite 一一二二的更多相关文章
- 在C#中利用Nuget包使用SQLite数据库和Linq to SQLite
本来是学习在VB中使用SQLite数据库和Linq to SQLite,结果先学习到了在C#中使用SQLite数据库和Linq to SQLite的方法,写出来与大家共同学习.(不知道算不算不务正业) ...
- 在VB中使用Linq To SQLite注意事项
昨天使Linq To SQLite 支持VB,今天在VB中写了几条Linq语句,发现了几个问题: 1.在Linq To SQLite中的Linq语句查询后并不是得到的匿名数据类,而是将Linq转换为S ...
- 在VB中利用Nuget包使用SQLite数据库和Linq to SQLite
上午解决了在C#中利用Nuget包使用SQLite数据库和Linq to SQLite,但是最后生成的是C#的cs类文件,对于我这熟悉VB而对C#白痴的来说怎么能行呢? 于是下午接着研究,既然生成的是 ...
- LINQ to SQLite完美解决方案
1.下载安装LinqConnectExpress(就是LinqConnect免费版) 2.安装好后就和LINQ TO SQL 一样了! 3.查询(增删改查和LINQ TO SQL 完全一样,你可以不 ...
- .NET环境下,通过LINQ操作SQLite数据库
//对应数据库中的某个表 [Table(Name = "main.Student")] public class Student { [Column(Na ...
- Linq To Sqlite使用心得
若要使用Linq To Sqlite类库,可以安装Devart Linq Connect Model,如图: 新建这个Model就可以和Linq To Sql一样使用Linq模型,下载地址:https ...
- Linq To SQLite by CRUD
1, 希望使用linqtoSQLite 来对数据库实现CRUD, 开发环境 VS2013, 1.1 在网上找到了 LINQ to DB T4 Models, 配置参考网址链接: http://www. ...
- Linq to Sqlite连接
本人还是挺喜欢用Sqlite,鼓捣半天终于连上了,赶紧记录一下 1.当然还是新建一个项目,还是winform, 2.Vs2012添加NoGet,点击工具--扩展和更新,搜索NoGet,安装. 3.管理 ...
- linq连接sqlite数据库(linq to sqlite) .net3.5
http://www.cnblogs.com/xianyin05/archive/2012/12/23/2829905.html using Models; using System; using S ...
随机推荐
- Windows Phone 8 MVVM
Why? 1 reason MVVM works really well with XAML based applications is because of the powerful XAML bi ...
- display:inline、block、inline-block 的区别
一.块级元素 与 行级元素 要理解display:inline.block.inline-block的区别,需要先了解HTML中的块级(block)元素和行级(inline)元素的特点,行内元素也叫 ...
- HTTPS原理介绍
内容来源于:http://www.guokr.com/post/114121/ 自己做个备忘. 二.HTTPS到底安全吗? 这个答案是肯定的,很安全.谷歌公司已经行动起来要大力推广HTTPS的使用,在 ...
- QSpinBox 和 QSlider 联合使用方法
在Qt中,有时候我们想要联合QSpinBox 和 QSlider,使得移动滑块,QSpinBox中的数据会变化,或者我们在QSpinBox中输入一个数值,响应的滑块也会变化,如下图所示:
- Hive_DDL与DML
DDL(数据定义语言) create.drop.alter.truncate.show.describe DML(数据控制语言) load.insert.update.delete.import/ex ...
- 教你彻底解决css中设置z-index的值无效的问题
在使用z-index这个属性之前,我们必须先了解使用z-index的必要条件: 1.要想给元素设置z-index样式,必须先让它变成定位元素,说的明白一点,就是要给元素设置一个postion:rela ...
- AJAX联想查询的例子
//通过输入值的不断改变而改变(按键事件)提示内容的功能,然后可以选着你想要的内容填充进来. html主要代码:test1.html <!DOCTYPE html><html> ...
- 解析私有IP地址和公网IP地址
局域网私有IP地址上外网的原理 IP地址分为两部分,网络号和主机号,这种分法应用在私有和公有IP地址上.一个局域网中,为了该局域网的安全,我们应用了私有IP地址,为了和Internet中的其他主机进行 ...
- spring security防御会话伪造session攻击
1. 攻击场景 session fixation会话伪造攻击是一个蛮婉转的过程. 比如,当我要是使用session fixation攻击你的时候,首先访问这个网站,网站会创建一个会话,这时我可以把附有 ...
- sql*loader的直接加载方式和传统加载方式的性能差异
1.确认数据库版本 2.数据准备 3.创建导入表及控制文件 4.直接加载方式演示 查看具体的日志: 5.传统加载方式演示 查看日志文件: 6.结论及两种方式的差异 经过比对direct比convent ...