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