一、 SQLite簡(jiǎn)介
SQLite是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理系統(tǒng),它包含在一個(gè)相對(duì)小的C庫(kù)中。它是D.RichardHipp建立的公有領(lǐng)域項(xiàng)目。
不像常見的客戶-服務(wù)器范例,SQLite引擎不是個(gè)程序與之通信的獨(dú)立進(jìn)程,而是連接到程序中成為它的一個(gè)主要部分。所以主要的通信協(xié)議是在編程語(yǔ)言內(nèi)的直接API調(diào)用。這在消耗總量、延遲時(shí)間和整體簡(jiǎn)單性上有積極的作用。整個(gè)數(shù)據(jù)庫(kù)(定義、表、索引和數(shù)據(jù)本身)都在宿主主機(jī)上存儲(chǔ)在一個(gè)單一的文件中。它的簡(jiǎn)單的設(shè)計(jì)是通過在開始一個(gè)事務(wù)的時(shí)候鎖定整個(gè)數(shù)據(jù)文件而完成的。
(摘自wiki: http://zh.wikipedia.org/w/index.php?title=SQLite&variant=zh-cn)
這個(gè)介紹就不說了,反正它就是個(gè)小型的SQL數(shù)據(jù)庫(kù),有點(diǎn)類似于ACCESS。先來試試它的功能吧。
二、 初步試探
經(jīng)過多方搜索,我找到了SQLite在.NET平臺(tái)的支持庫(kù),點(diǎn)擊 這里 下載。我按照默認(rèn)安裝,路徑為:”c://program files/sqlite.net”,安裝后進(jìn)入這個(gè)文件夾,里面有好多文件,我們只需要”System.Data.SQLite.DLL”,很小,只有605K。打開VS,新建一個(gè)控制臺(tái)程序sqlitetest。引用剛才提到的DLL文件。然后引用”System.Data.SQLite”命名空間。現(xiàn)在就可以試試了。
從網(wǎng)上查詢到了一些資料,現(xiàn)在運(yùn)用一下,看看行不行。
第一步,創(chuàng)建數(shù)據(jù)庫(kù)文件。
我聲明了一個(gè)全局字符串變量”dbName”,方面以后使用。
新建數(shù)據(jù)庫(kù)文件的相關(guān)代碼為:
是不是超級(jí)簡(jiǎn)單。接下來就是連接了。同樣是SQLiteConnection這個(gè)類。這個(gè)類有3個(gè)構(gòu)造函數(shù),一個(gè)是空參數(shù),另一個(gè)是SQLiteConnection類型,就是復(fù)制一個(gè)連接了,最后一個(gè)是字符串類型(連接字符串),這個(gè)連接字符串包含數(shù)據(jù)庫(kù)信息已經(jīng)密碼(這個(gè)輕量級(jí)的數(shù)據(jù)庫(kù)也支持密碼哦,好厲害),我現(xiàn)在還不懂格式是什么,先試試默認(rèn)構(gòu)造函數(shù)。網(wǎng)上給的是使用SQLiteConnectionStringBuilder這個(gè)類構(gòu)造連接字符串。它有很多屬性,現(xiàn)在要用的是DataSource屬性,把dbName賦給它。還有Password屬性,沒有密碼吧,賦給它””吧。然后就是打開數(shù)據(jù)庫(kù)了。所有代碼如下:
接下來理所當(dāng)然地要插入張表試試。
SQLite有個(gè)跟SQLCommand類似的SQLiteCommand,用法也差不多,這就不多說了,直接給出代碼吧:
一起把插入數(shù)據(jù)的代碼也貼了,都一樣的東西:
接下來就要查詢數(shù)據(jù)了,看看結(jié)果如何。網(wǎng)上教程用的是SQLiteReader,是不是和SQLReader很像?對(duì)啊,其實(shí)用法也是一樣的,看來這東西做得還是很方便的,代碼如下:
只要用過ADO.NET的看懂上面的代碼都沒問題吧,行,我們運(yùn)行一下吧!
等啊等,哦,出錯(cuò)了:Invalid ConnectionString format for parameter "Password".原來這句有問題,那好吧,刪掉試試。行了,呵呵,成功了!再看看網(wǎng)上的文章,注釋為“設(shè)置密碼”,意思這一步是設(shè)置密碼?試試。真行了,與此相關(guān)的東西接下來再測(cè)試。
好吧,首戰(zhàn)告捷,現(xiàn)在我們進(jìn)一步對(duì)其進(jìn)行測(cè)試!進(jìn)行之前把完整代碼貼出來吧。
三、 連接部分深入測(cè)試
第二部分基本是照著網(wǎng)上的一篇文章弄的,現(xiàn)在來點(diǎn)自己的測(cè)試。這次就不能再創(chuàng)建數(shù)據(jù)庫(kù)了吧,別把剛才的給蓋了。好的,開始,把創(chuàng)建數(shù)據(jù)庫(kù)文件和添加表那一部分刪除。先直接運(yùn)行,有四條記錄了。說明文件連接正常,已經(jīng)起到存儲(chǔ)的作用了。
研究一下SQLiteConnection的相關(guān)內(nèi)容。
首先是它那幾個(gè)構(gòu)造函數(shù)。復(fù)制連接那個(gè)就不管了,看它剩下的那個(gè)構(gòu)造函數(shù)吧,看看是什么格式??裨囎匀徊恍?,單步調(diào)試吧,不是有一步是把connsb(SQLiteConnectionStringBuilder)的值轉(zhuǎn)換為string后賦值給conn(SQLiteConnection)嗎,看看connsb的值,發(fā)現(xiàn)了,是”Data Source=sqlitetest.db;Password=acen”,應(yīng)該就是這個(gè)了,試試。測(cè)試通過,那么把密碼去掉試試。”File opened that is not a database file .file is encrypted or is not a database”,不出所料,出錯(cuò)了。剛才查看SQLiteConnection屬性的時(shí)候,看到有DataSource項(xiàng),莫非不用借助SQLiteConnectionStringBuilder直接賦值也行?嘿嘿,不用得意得太早,這是只讀的,行不通。我要修改密碼怎么辦呢?再認(rèn)真看看,從連接字符串一定是不可能的了,那就從SQLiteConnection這個(gè)類看看吧,有個(gè)SetPassword方法,這個(gè)方法有兩種參數(shù),一種是字節(jié)數(shù)組,另一種是字符串形式,用第二種吧,改為”imacen”,能運(yùn)行,問題是能多次運(yùn)行,不對(duì)吧,密碼沒改到?把新密碼加到連接字符串,果真出錯(cuò)了。我剛才是放在打開數(shù)據(jù)庫(kù)之前,莫非不能這樣?那放在后面吧,還是錯(cuò)了,提示設(shè)置密碼應(yīng)當(dāng)在數(shù)據(jù)庫(kù)開始之前,莫非這只是設(shè)置連接時(shí)的密碼?嗨,我錯(cuò)了,我沒認(rèn)真看,它還有個(gè)changePassword的方法,這個(gè)才是啊,而且要放在數(shù)據(jù)庫(kù)打開后。那我就納悶了,為什么有setPassword方法卻沒有setDataSource方法呢?把連接字符串的密碼部分刪了,再試試setPassword方法。成功,它真的是設(shè)置連接密碼的,我想它為什么要加入這個(gè)方法呢,可能考慮到安全新問題吧,其它都是使用明文,只是猜測(cè)罷了。行,這部分就這樣了,能連了就得。
總結(jié)一下:
1. 可以使用SQLiteConnectionStringBuilder類構(gòu)建鏈接字符串,然后轉(zhuǎn)換為string賦給SQLiteConnection的ConnectionString屬性,密碼沒有就別寫成””了。
2. 在構(gòu)造SQLiteConnection時(shí)直接用連接字符串,格式為”Data Source=xxx;Password=xxx”;其中密碼部分可以在setPassword方法中設(shè)置。
3. 修改密碼使用SQLiteConnection的changePassword方法,需在數(shù)據(jù)庫(kù)打開之后。
四、 插入數(shù)據(jù)測(cè)試
SQLite不支持存儲(chǔ)過程,雖然它的類SQLiteCommand有一個(gè)CommandType屬性,但其明確寫著目前僅支持CommandType.Text.那我要測(cè)試什么呢?參數(shù)功能。開始啦!
記得在前面給出的代碼中有插入數(shù)據(jù)部分,現(xiàn)在把插入語(yǔ)句換成” INSERT INTO [TEST] (ID,name) VALUES (@ID,@name)";有Parameters這個(gè)屬性吧,真的有,不好意思了,連Add,AddWithValue都有,好啊,先用AddWithValue這種最簡(jiǎn)單的試試。
運(yùn)行,顯然行。那我們就和SQLCommand對(duì)比一下吧。粗略看了一下,SQLCommand有的SQLiteCommand都有,莫非SQLiteCommand就是繼承自SQLCommand?或者兩者是繼承自同一個(gè)接口,從”System.Data.SQLite”,”System.Data.SQLClient”來看,這兩者應(yīng)該是繼承自同一個(gè)接口了??纯茨懿荒苷抑C據(jù)。
后來我還分析了一下,這個(gè)SQLite應(yīng)該就是把各個(gè)類重寫了一下,再把SQL Server的功能精簡(jiǎn)后編譯成DLL文件。我沒用過ACCESS,但我覺得SQLite跟ACCESS應(yīng)該就是同類的東西了吧。這個(gè)我不敢下斷言。
用SQLite的好處在于,它能執(zhí)行大部分SQL語(yǔ)句,而且網(wǎng)上評(píng)論認(rèn)為它的性能是相當(dāng)高的,另外一個(gè)最重要的原因是,它很小,1M不到的體積對(duì)于小型數(shù)據(jù)運(yùn)用是非常方便的了。
聯(lián)系客服