Linq To Sqlite 一一二二

說在前頭數據庫

  之因此寫下這些文字,主要是由於使用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裏集成了; 

打開Nuget

   

  三、在PM>提示符後輸入命令:(請保持網絡暢通,下邊命令要聯網下載)
     Install-Package linq2db.SQLite

  

  四、完裝完成後,自動添加了依賴項:System.Data.SQLite、linq2db、ling2db.t4models(建立Linq to SQLite的T4模板)
在解決方案資源管理器中添加了幾項(是否是幫你把原來要本身作的事代勞了?,世界一會兒變得美好了),如圖:

  安裝linqtoDB後的效果

  五、打開解決方案資源管理器中LinqTODB.Template文件夾中的CopyMe.SQLite.tt.txt文件,如圖:

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日於圖書館。

相關文章
相關標籤/搜索