說在前頭數據庫
之因此寫下這些文字,主要是由於使用LINQ的同志們都覺它的美好(至於有多美好,各位內心知道,我就不在描述了,若是你是你還不瞭解LINQ,園子裏有大把的文章),微軟老哥只提供了自家的SQLServer的支持 -LinqToSql ,然而不少項目,特別是小型的項目,部署SQLServer太過於麻煩(光下載就夠嗆),Sqlite、Access就成不少人的選擇,但又不想去寫那「紅統統」(VS中字符串的顏色)的SQL語句,因而祭出了Google大神,發現夥伴們經常使用的是Dblinq,但配置讓不少新手有點傷神(至少那個每次要用 DbMetal.exe命令生成對象就有點……,反正我是比較懶),收費的就不用說了(咱們這一行的,口袋都有點緊……)。網絡
進入正題ide
這裏主要是介紹使用Linq To DB,它相對如今已有的方案來講,用法是比較簡單的。下面咱們就開始吧!函數
一、打開VS,新建一個項目(我建的是Winform)並保存,名稱隨意;工具
二、安裝Nuget的Linq to SQLite包,打開Nuget包管理器控制檯(VS 菜單 「工具」-->庫程序包管理器-->庫程序包管理器控制檯)以下圖;測試
Nuget是什麼?google
沒有它時,咱們引用一些開源的庫至少須要作如的一些事:spa
a、找到正確的資源(庫文件及其依賴項);code
b、下載相應的資源(有下錯及別欺騙過的經歷沒?);orm
c、添加引用;
很長一段時間,大夥兒一直重複着這樣的折騰,終於有一夥人受不了拉,因而Nuget誕生了,好東西微軟確定是不放過,因而VS裏集成了;
三、在PM>提示符後輸入命令:(請保持網絡暢通,下邊命令要聯網下載)
Install-Package linq2db.SQLite
四、完裝完成後,自動添加了依賴項:System.Data.SQLite、linq2db、ling2db.t4models(建立Linq to SQLite的T4模板)
在解決方案資源管理器中添加了幾項(是否是幫你把原來要本身作的事代勞了?,世界一會兒變得美好了),如圖:
五、打開解決方案資源管理器中LinqTODB.Template文件夾中的CopyMe.SQLite.tt.txt文件,如圖:
圖中紅框依次爲下面生成類文件的,命名空間,數據庫目錄,數據庫名稱 (請更改成你本身的命名空間,數據庫名目錄,數據庫名,上圖是我測試項目使用的,不然沒法正常繼續)。
注意:若是數據庫有密碼且是用「SQLite2009 Pro」建立的,密碼類型請選擇第三項 RSA(Compatible with ADO.NET Provider),不然打不開數據庫,會一直提示「File is encrypted or is not a database」
六、將後面的.TXT去掉,保存,此時會提示,是否執行,點是。就會在此文件同目錄下生成一個類文件(後面程序中會用到)如圖:
七、如今就可使用Linq To Sqlite了;
1 var db = new DatabaseHelper1DB(@"Data Source=F:\Yun\VolcanoCloudTest\DatabaseHelper2.db3;Version=3;Password=1"); 2 var temp = 3 from c in db.Users 4 select c; 5 foreach (var c in temp) 6 listBox1.Items.Add(c.Name);
可是很遺憾,一個異常出來了,是說鏈接數符串沒有定義。原來生成類中的DatabaseHelper1DB構造函數<public DatabaseHelper1DB(string configuration)>的字符串類型的參數是鏈接字符串配置文件中Name,不是鏈接字符串自己。我不想去配置鏈接字符串,由於多數時間(至少我是這樣)鏈接字符串是代碼動態生成的。辦法老是有的,咱們來看看DatabaseHelper1DB的基類 LinqToDB.Data.DataConnection ,它有一個這樣的構造函數:
1 public DataConnection(IDataProvider dataProvider, string connectionString);
第二參數正是咱們想要的鏈接字符串自己,問題是第一個參數怎麼傳入,派生類的代碼又是自動生成的。怎麼辦呢?方法有二
a、修改生成後的類文件爲:
1 public DatabaseHelper1DB(string configuration) 2 :base(configuration) //原來的 3 { 4 InitDataContext(); 5 } 6 7 public DatabaseHelper1DB(string configuration) 8 :base(new LinqToDB.DataProvider.SQLite.SQLiteDataProvider(), configuration) //修改後的 9 { 10 InitDataContext(); 11 }
但這樣有一個問題,代碼每生成一次,我都要修改一次,不省心呀(以爲不省心的,請看第二種)
b、修改代碼生成模板,這樣一勞永逸。找到文件「LinqToDB.ttinclude」進行以下修改:
if (GenerateConstructors) { if (DefaultConfiguration == null) DataContextObject.Members.Add(new Method(null, DataContextObject.Name, new string[0], new[] { "InitDataContext();" })); else DataContextObject.Members.Add(new Method(null, DataContextObject.Name, new string[0], 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),所以要引入命名空間。
1 using LinqToDB;
插入:
1 User uNew = new User(); 2 uNew.Name = "test"; 3 uNew.Password = "11"; 4 db.Insert(uNew);
更新:
1 using (var db = new DatabaseHelper1DB(@"Data Source=F:\Yun\VolcanoCloudTest\DatabaseHelper2.db3;Version=3;Password=1")) 2 { 3 db.Users 4 .Where(u => u.ID == 1) 5 .Set(p => p.Name,"test") 6 .Update(); 7 }
刪除:
1 using (var db = new DatabaseHelper1DB(@"Data Source=F:\Yun\VolcanoCloudTest\DatabaseHelper2.db3;Version=3;Password=1")) 2 { 3 db.Users 4 .Where(u => u.ID == 1) 5 .Delete(); 6 }
另外,linqtodb還支持access(看到不少同志在找 linq to access,有人還用上收費的,這可能又是一福音)等十餘中數據庫,使用方法相似,本文已經很長了(我喜歡簡短的文章,閱讀方便),因此不在贅述,想要用的同志就本身動手吧。
末了
本文是我在園子裏的第一篇(處女做),但願你們多指正,若是能幫上你,我表示灰常灰常的高興。 2015年1月6日於圖書館。