C#實現一個簡單的SQLite ORM框架記錄

有個項目需要保存多個配置項,配置項可能隨著開發不斷增加。偏向使用SQLite數據庫配合ORM(對象關系映射)來實現。

因為要求并不復雜,就打算自己簡單實現一下,練下手。

這里記錄遇到的一些點。

  1. C#中的泛型類,可以看作時針對某種泛型生成了新的類。比如類聲明的靜態代碼塊(靜態構造函數static ClassName(){}會在使用新的泛型時重新執行。不同泛型,類的靜態變量也不互通。
  2. 類的readonly字段只能在聲明期間或構造函數賦值(包括靜態構造函數,當然這種情況需要變量也是靜態的)。

反射

  1. 反射可通過System.Type對象實現,Type對象可由typeof(ClassName)obj.getType()獲得。
  2. 類內容的獲取:Type對象有一系列Get()方法,可以訪問類內的屬性(即有get()set()的變量)、變量、方法等,返回值都是封裝好的對象或是對象集合。
  3. 實例的創建,Activator.CreateInstance()
    T t=Activator.CreateInstance<T>();
    
  4. 泛型實例屬性讀寫(SetValue()/GetValue()):
    public void Increase(T t)
    {
        var propA = typeof(T).GetProperty("A");
        var value = propA.GetValue(t, null);
        if (propA.PropertyType == typeof(int))
        {
            var result = int.Parse(value.ToString()) + 1;
            propA.SetValue(t, result, null);
        }
    }
    

特性(注解)

  1. 通過繼承System.Attribute類即可。
    public class NonSQL : Attribute
    {
    
    }
    
    class Person
    {
        [NonSQL]
        public string FirstName {get;set;}
    }
    
  2. 想要獲取屬性的特性,可以通過PropertyInfo.GetCustomAttributes()即可獲取,其他如字段等也有類似方法。

SQLite

  1. SQLite對alter的支持有限,字段一旦添加,就不能通過alter語句修改字段的屬性(類型、主鍵等)。
  2. 查找表是否存在,(0-表名):
    select count(*)  from sqlite_master where type='table' and name = '{0}';
    
  3. 建表,(0-表名;1-以逗號隔開的字段定義):
    create table if not exists {0} ({1});
    
  4. 添加字段,(0-表名;1-字段定義):
    alter table {0} add column {1};
    
  5. 插入,(0-表名;1-以逗號隔開的字段;2-以逗號隔開的字段對應值):
    insert or replace into {0} ({1}) values ({2});
    
  6. where子句使用:以and連接多個條件,除了邏輯運算符外,還可以使用like做字符匹配,百分號(%)代表零個、一個或多個數字或字符,下劃線(_)代表一個單一的數字或字符,符號可被組合使用。
  7. 執行查詢時會返回SQLiteDataReader對象,有很多方法,這里說兩個常用的。
    1. 通過Read()讀取一列數據,讀取成功返回true。
    2. 通過["{PropName}"]可以直接讀取字段的值。
  8. 兩種執行語句的方法
    // 只是執行一條SQL語句
    private void ExecuteNonQuery(string sql)
    {
        lock (connection)
        {
            EnsureDatabaseConnected();
            using (var tr = connection.BeginTransaction())
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = sql;
                    command.ExecuteNonQuery();
                }
                tr.Commit();
            }
        }
    }
    
    // 執行一條SQL語句,并執行提供的操作,一般用于查詢
    private void ExecuteQuery(string sql, Action<SQLiteDataReader> action)
    {
        lock (connection)
        {
            EnsureDatabaseConnected();
            using (var command = connection.CreateCommand())
            {
                command.CommandText = sql;
                var reader = command.ExecuteReader();
                action(reader);
            }
        }
    }
    
    //后一種的使用示例
    public int GetTableCount(string tableName)
    {
        var tableCount = 0;
        var tableCountSql = string.Format("select count(*)  from sqlite_master where type='table' and name = '{0}';", tableName);
    
        ExecuteQuery(tableCountSql, reader =>
        {
            reader.Read();
            tableCount = reader.GetInt32(0);
        });
    
        return tableCount;
    }
    

其他

  1. 盡量使用泛型方法而不是泛型類。
  2. String.IsNullOrWhiteSpace(),除了null和空字符串(String.IsNullOrEmpty()判斷范圍),還擴展了空白字符的判斷。
  3. C#中有一個System.IO.Path類,可以很方便的拼接文件路徑、提取文件所在文件夾等。并且操作是跨平臺的。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,733評論 18 399
  • 大概是五天前,我發現魚缸里有條魚不再進食,不知是生了什么病,于是它越來越瘦,從剛開始的活潑也變得喜歡沉在水底...
    我們每個人都有理想閱讀 232評論 0 0
  • 總結: 英語,對于閱讀,主要的大原則是形成認知慣性,利用其快速閱讀過去理解生詞和生句 個人,真正地鍛煉自己解決問題...
    車凱威RichardFeynm閱讀 129評論 0 0
  • 本文適用于成都個人買社保,網上繳費。 網址 成都市社會保險網上經辦系統 操作指南文檔地址: 打開成都市社會保險網上...
    寧靜的夜閱讀 1,773評論 0 0
  • 時間沒有重來,所以你要在最美的年華努力綻放最美的自己,別讓遺憾成永遠。
    紅蓮天舞閱讀 140評論 0 0