在WPF中使用SQLite

SQLite數(shù)據(jù)操作流程

  1. 打開(kāi)數(shù)據(jù)庫(kù)連接
    1. 針對(duì)要操作的數(shù)據(jù)庫(kù)闹究,建立一個(gè)SQLiteConnection實(shí)例connection囚玫。然后調(diào)用connection.Open()
    2. 這個(gè)連接實(shí)例在生存期內(nèi)都是與數(shù)據(jù)庫(kù)文件綁定的霜医,也就是這個(gè)連接實(shí)例存在期間,你是不能對(duì)數(shù)據(jù)庫(kù)文件做刪除等操作的。
  2. 創(chuàng)建事務(wù)
  3. 執(zhí)行操作,這里的操作對(duì)應(yīng)的是SQLite中的Command朗若。它是對(duì)SQL語(yǔ)句的封裝。根據(jù)操作的不同昌罩,一般我們主要使用兩種執(zhí)行方式。
    1. 需要返回?cái)?shù)據(jù)灾馒。比如查茎用。可以通過(guò)command.ExecuteReader()返回的SQLiteDataReader對(duì)數(shù)據(jù)進(jìn)行讀取工作睬罗。
    2. 不需要返回?cái)?shù)據(jù)轨功。比如增刪改∪荽铮可以通過(guò)command.ExecuteNonQuery()古涧,該函數(shù)返回?cái)?shù)據(jù)庫(kù)中受影響的列數(shù)。
  4. 提交事務(wù)花盐,至此操作完成羡滑。
  5. 關(guān)閉數(shù)據(jù)庫(kù)連接,調(diào)用connection.Close()算芯∑饣瑁可選。
    1. 如數(shù)據(jù)庫(kù)操作很少熙揍,建議使用之后及時(shí)關(guān)閉职祷。
    2. 如果會(huì)頻繁使用,建議保留連接届囚,避免每次需要都創(chuàng)建有梆。

詳細(xì)步驟

在項(xiàng)目中引入SQLite

右鍵項(xiàng)目選擇 管理NuGet包:

管理Nuget包

接下來(lái)安裝SQLite.Core

安裝SQLite.Core

代碼實(shí)例

  1. 創(chuàng)建數(shù)據(jù)庫(kù)連接,我傾向于使用一個(gè)全局靜態(tài)變量來(lái)一直保存數(shù)據(jù)庫(kù)連接意系。
    // 數(shù)據(jù)庫(kù)文件夾
    static string DbPath = Path.Combine(YatesHelper.GetAppDefaultPath(), "Database");
    
    //與指定的數(shù)據(jù)庫(kù)(實(shí)際上就是一個(gè)文件)建立連接
    private static SQLiteConnection CreateDatabaseConnection(string dbName = null)
    {
        if (!string.IsNullOrEmpty(DbPath) && !Directory.Exists(DbPath))
            Directory.CreateDirectory(DbPath);
        dbName = dbName == null ? "database.db" : dbName;
        var dbFilePath = Path.Combine(DbPath, dbName);
        return new SQLiteConnection("DataSource = " + dbFilePath);
    }
    
    // 使用全局靜態(tài)變量保存連接
    private static SQLiteConnection connection = CreateDatabaseConnection();
    
  2. 打開(kāi)數(shù)據(jù)庫(kù)連接
    // 判斷連接是否處于打開(kāi)狀態(tài)
    private static void Open(SQLiteConnection connection)
    {
        if (connection.State != System.Data.ConnectionState.Open)
        {
            connection.Open();
        }
    }
    
  3. 使用事務(wù)泥耀,使用using語(yǔ)句會(huì)使代碼比較清晰。using (var tr = connection.BeginTransaction())
  4. 執(zhí)行非查詢SQL語(yǔ)句代碼昔字,適用于建表爆袍、增刪改等首繁。
    public static void ExecuteNonQuery(string sql)
    {
        // 確保連接打開(kāi)
        Open(connection);
    
        using (var tr = connection.BeginTransaction())
        {
            using (var command = connection.CreateCommand())
            {
                command.CommandText = sql;
                command.ExecuteNonQuery();
            }
            tr.Commit();
        }
    }
    
  5. 執(zhí)行查詢語(yǔ)句,因?yàn)椴樵兩婕暗骄唧w的數(shù)據(jù)陨囊,這里只詳細(xì)解釋方法含義弦疮。
    public static void ExecuteQuery(string sql)
    {
        // 確保連接打開(kāi)
        Open(connection);
    
        using (var tr = connection.BeginTransaction())
        {
            using (var command = connection.CreateCommand())
            {
                command.CommandText = sql;
    
                // 執(zhí)行查詢會(huì)返回一個(gè)SQLiteDataReader對(duì)象
                var reader = command.ExecuteReader();
    
                //reader.Read()方法會(huì)從讀出一行匹配的數(shù)據(jù)到reader中。注意:是一行數(shù)據(jù)蜘醋。
                while (reader.Read())
                {
                    // 有一系列的Get方法胁塞,方法的參數(shù)是列數(shù)。意思是獲取第n列的數(shù)據(jù)压语,轉(zhuǎn)成Type返回啸罢。
                    // 比如這里的語(yǔ)句,意思就是:獲取第0列的數(shù)據(jù)胎食,轉(zhuǎn)成int值返回扰才。
                    var time = reader.GetInt64(0);
                }
            }
            tr.Commit();
        }
    }
    
  6. 如何刪除數(shù)據(jù)庫(kù)?
    // 因?yàn)镾QLite是文件型數(shù)據(jù)庫(kù)厕怜,可以直接刪除文件衩匣。但只要數(shù)據(jù)庫(kù)連接沒(méi)有被回收,就無(wú)法刪除文件粥航。
    public static void DeleteDatabase(string dbName)
    {
        var path = Path.Combine(DbPath, dbName);
        connection.Close();
    
        // 置空琅捏,手動(dòng)GC,并等待GC完成后執(zhí)行文件刪除递雀。
        connection = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
        File.Delete(path);
    }
    

問(wèn)題

遇到的問(wèn)題柄延,主要是打包安裝后會(huì)出現(xiàn)。問(wèn)題的原因其實(shí)是一致的缀程。如果你捕獲了全局異常搜吧,就能從異常信息中得到錯(cuò)誤原因。

SQLite.Interop.dll的問(wèn)題

System.BadImageFormatException: 試圖加載格式不正確的程序杠输。
System.DllNotFoundException: 無(wú)法加載 DLL“SQLite.Interop.dll”: 找不到指定的模塊赎败。

這個(gè)是因?yàn)閺腘uGet獲得的包內(nèi)是沒(méi)有SQLite.Interop.dll的,但是在Debug的時(shí)候蠢甲,它會(huì)自動(dòng)生成對(duì)應(yīng)平臺(tái)的dll僵刮。可以看一下項(xiàng)目目錄下(../packages/System.Data.SQLite/build)

build文件夾

里面有各個(gè).NET版本的對(duì)應(yīng)平臺(tái)的SQLite.Interop.dll鹦牛。打包的時(shí)候搞糕,將對(duì)應(yīng)的文件一起打包即可。如果要兼顧x86x64曼追,也可以在打包時(shí)指定在應(yīng)用文件夾窍仰,創(chuàng)建x86x64目錄,并將對(duì)應(yīng)的SQLite.Interop.dll放進(jìn)去礼殊。這也是最保險(xiǎn)的方法驹吮。

分平臺(tái)打包
應(yīng)用沒(méi)有應(yīng)用文件夾的訪問(wèn)權(quán)限

以管理員權(quán)限運(yùn)行即可针史。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市碟狞,隨后出現(xiàn)的幾起案子啄枕,更是在濱河造成了極大的恐慌,老刑警劉巖族沃,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件频祝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡脆淹,警方通過(guò)查閱死者的電腦和手機(jī)常空,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盖溺,“玉大人漓糙,你說(shuō)我怎么就攤上這事「拦瘢” “怎么了兼蜈?”我有些...
    開(kāi)封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拙友。 經(jīng)常有香客問(wèn)我,道長(zhǎng)歼郭,這世上最難降的妖魔是什么遗契? 我笑而不...
    開(kāi)封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮病曾,結(jié)果婚禮上牍蜂,老公的妹妹穿的比我還像新娘。我一直安慰自己泰涂,他們只是感情好鲫竞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著逼蒙,像睡著了一般从绘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上是牢,一...
    開(kāi)封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天僵井,我揣著相機(jī)與錄音,去河邊找鬼驳棱。 笑死批什,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的社搅。 我是一名探鬼主播驻债,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼乳规,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了合呐?” 一聲冷哼從身側(cè)響起暮的,我...
    開(kāi)封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎合砂,沒(méi)想到半個(gè)月后青扔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翩伪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年微猖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缘屹。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凛剥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轻姿,到底是詐尸還是另有隱情犁珠,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布互亮,位于F島的核電站犁享,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏豹休。R本人自食惡果不足惜炊昆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望威根。 院中可真熱鬧凤巨,春花似錦、人聲如沸洛搀。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)留美。三九已至彰檬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間独榴,已是汗流浹背僧叉。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棺榔,地道東北人瓶堕。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像症歇,于是被迫代替她去往敵國(guó)和親郎笆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谭梗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)宛蚓,斷路器激捏,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法凄吏,內(nèi)部類的語(yǔ)法远舅,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法痕钢,線程的語(yǔ)...
    子非魚_t_閱讀 31,632評(píng)論 18 399
  • 《ijs》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 10...
    葉染柒丶閱讀 5,152評(píng)論 0 7
  • 秋已盡图柏,冬即始,薄霧漸褪任连,陽(yáng)光正好蚤吹;靜倚閑窗,輕鎖時(shí)光随抠,微風(fēng)浮過(guò)裁着,思緒飄向遠(yuǎn)方;搖曳百葉窗拱她,曾經(jīng)綠茵微瀾二驰,早已褶皺...
    一米陽(yáng)光ZZ閱讀 333評(píng)論 1 4
  • 1 數(shù)據(jù)傾斜調(diào)優(yōu) 1.1 調(diào)優(yōu)概述 有的時(shí)候,我們可能會(huì)遇到大數(shù)據(jù)計(jì)算中一個(gè)最棘手的問(wèn)題——數(shù)據(jù)傾斜秉沼,此時(shí)Spar...
    wisfern閱讀 2,935評(píng)論 0 23