一、 SQLite簡介
SQLite是遵守ACID的關聯式數據庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域項目。
不像常見的客戶-服務器范例,SQLite引擎不是個程序與之通信的獨立進程,而是連接到程序中成為它的一個主要部分。所以主要的通信協議是在編程語言內的直接API調用。這在消耗總量、延遲時間和整體簡單性上有積極的作用。整個數據庫(定義、表、索引和數據本身)都在宿主主機上存儲在一個單一的文件中。它的簡單的設計是通過在開始一個事務的時候鎖定整個數據文件而完成的。
這個介紹就不說了,反正它就是個小型的SQL數據庫,有點類似於ACCESS。先來試試它的功能吧。
二、創建sqlite數據庫
1、創建空的sqlite數據庫。
// 方法一:創建一個空sqlite數據庫,用IO的方式
FileStream fs = File.Create( “ c:\\test.db “);
// 方法二:用SQLiteConnection
SQLiteConnection.CreateFile( “ c:\\test.db “);
創建的數據庫是個0字節的文件。
2、創建加密的空sqlite數據庫
SQLiteConnection.CreateFile( “ c:\\test2.db “);
SQLiteConnection cnn = new SQLiteConnection( “ Data Source=c:\\test2.db “);
SQLiteConnection cnn = new SQLiteConnection( “ Data Source=D:\\test2.db “);
cnn.Open();
cnn.ChangePassword( “ password “);
3、給未加密的數據庫加密
cnn.Open();
cnn.ChangePassword( “ password “);
4、打開加密sqlite數據庫
//方法一
SQLiteConnection cnn = new SQLiteConnection(“Data Source=c:\\test2.db“);
cnn.SetPassword(“password“);
cnn.Open();
//方法二
SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.DataSource = @”c:\test.db“;
builder.Password = @”password“;
SQLiteConnection cnn = new SQLiteConnection(builder.ConnectionString);
cnn .Open();
分頁
select * from messages limit 10,100;
表示跳過10行,取100行的返回結果。
三、 初步試探
經過多方搜索,我找到了SQLite在.NET平台的支持庫,點擊 這里 下載。我按照默認安裝,路徑為:”c://program files/sqlite.net”,安裝后進入這個文件夾,里面有好多文件,我們只需要”System.Data.SQLite.DLL”,很小,只有605K。打開VS,新建一個控制台程序sqlitetest。引用剛才提到的DLL文件。然后引用”System.Data.SQLite”命名空間。現在就可以試試了。
從網上查詢到了一些資料,現在運用一下,看看行不行。
第一步,創建數據庫文件。
我聲明了一個全局字符串變量”dbName”,方面以后使用。
新建數據庫文件的相關代碼為:

SQLiteConnection.CreateFile(dbName);
是不是超級簡單。接下來就是連接了。同樣是SQLiteConnection這個類。這個類有3個構造函數,一個是空參數,另一個是SQLiteConnection類型,就是復制一個連接了,最后一個是字符串類型(連接字符串),這個連接字符串包含數據庫信息已經密碼(這個輕量級的數據庫也支持密碼哦,好厲害),我現在還不懂格式是什么,先試試默認構造函數。網上給的是使用SQLiteConnectionStringBuilder這個類構造連接字符串。它有很多屬性,現在要用的是DataSource屬性,把dbName賦給它。還有Password屬性,沒有密碼吧,賦給它””吧。然后就是打開數據庫了。所有代碼如下:
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();
一起把插入數據的代碼也貼了,都一樣的東西:
cmd.CommandText = " INSERT INTO [TEST] (ID,name) VALUES (1,'acen') " ;
cmd.ExecuteNonQuery();
cmd.CommandText = " INSERT INTO [TEST] (ID,name) VALUES (2,'unique') " ;
cmd.ExecuteNonQuery();
接下來就要查詢數據了,看看結果如何。網上教程用的是SQLiteReader,是不是和SQLReader很像?對啊,其實用法也是一樣的,看來這東西做得還是很方便的,代碼如下:
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".原來這句有問題,那好吧,刪掉試試。行了,呵呵,成功了!再看看網上的文章,注釋為“設置密碼”,意思這一步是設置密碼?試試。真行了,與此相關的東西接下來再測試。
好吧,首戰告捷,現在我們進一步對其進行測試!進行之前把完整代碼貼出來吧。


















































三、連接部分深入測試
第二部分基本是照着網上的一篇文章弄的,現在來點自己的測試。這次就不能再創建數據庫了吧,別把剛才的給蓋了。好的,開始,把創建數據庫文件和添加表那一部分刪除。先直接運行,有四條記錄了。說明文件連接正常,已經起到存儲的作用了。
研究一下SQLiteConnection的相關內容。
首先是它那幾個構造函數。復制連接那個就不管了,看它剩下的那個構造函數吧,看看是什么格式。狂試自然不行,單步調試吧,不是有一步是把connsb(SQLiteConnectionStringBuilder)的值轉換為string后賦值給conn(SQLiteConnection)嗎,看看connsb的值,發現了,是”Data Source=sqlitetest.db;Password=acen”,應該就是這個了,試試。測試通過,那么把密碼去掉試試。”File opened that is not a database file .file is encrypted or is not a database”,不出所料,出錯了。剛才查看SQLiteConnection屬性的時候,看到有DataSource項,莫非不用借助SQLiteConnectionStringBuilder直接賦值也行?嘿嘿,不用得意得太早,這是只讀的,行不通。我要修改密碼怎么辦呢?再認真看看,從連接字符串一定是不可能的了,那就從SQLiteConnection這個類看看吧,有個SetPassword方法,這個方法有兩種參數,一種是字節數組,另一種是字符串形式,用第二種吧,改為”imacen”,能運行,問題是能多次運行,不對吧,密碼沒改到?把新密碼加到連接字符串,果真出錯了。我剛才是放在打開數據庫之前,莫非不能這樣?那放在后面吧,還是錯了,提示設置密碼應當在數據庫開始之前,莫非這只是設置連接時的密碼?嗨,我錯了,我沒認真看,它還有個changePassword的方法,這個才是啊,而且要放在數據庫打開后。那我就納悶了,為什么有setPassword方法卻沒有setDataSource方法呢?把連接字符串的密碼部分刪了,再試試setPassword方法。成功,它真的是設置連接密碼的,我想它為什么要加入這個方法呢,可能考慮到安全新問題吧,其它都是使用明文,只是猜測罷了。行,這部分就這樣了,能連了就得。
總結一下:
1. 可以使用SQLiteConnectionStringBuilder類構建鏈接字符串,然后轉換為string賦給SQLiteConnection的ConnectionString屬性,密碼沒有就別寫成””了。
2. 在構造SQLiteConnection時直接用連接字符串,格式為”Data Source=xxx;Password=xxx”;其中密碼部分可以在setPassword方法中設置。
3. 修改密碼使用SQLiteConnection的changePassword方法,需在數據庫打開之后。
四、 插入數據測試
SQLite不支持存儲過程,雖然它的類SQLiteCommand有一個CommandType屬性,但其明確寫着目前僅支持CommandType.Text.那我要測試什么呢?參數功能。開始啦!
記得在前面給出的代碼中有插入數據部分,現在把插入語句換成” INSERT INTO [TEST] (ID,name) VALUES (@ID,@name)";有Parameters這個屬性吧,真的有,不好意思了,連Add,AddWithValue都有,好啊,先用AddWithValue這種最簡單的試試。
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”來看,這兩者應該是繼承自同一個接口了。看看能不能找着證據。
很明顯,他們確實是繼承自同一個類或接口,那就沒什么好說的啦,這個測試也差不多就這樣啦,其它讀取,更新那些也應該就一樣了。
后來我還分析了一下,這個SQLite應該就是把各個類重寫了一下,再把SQL Server的功能精簡后編譯成DLL文件。我沒用過ACCESS,但我覺得SQLite跟ACCESS應該就是同類的東西了吧。這個我不敢下斷言。
用SQLite的好處在於,它能執行大部分SQL語句,而且網上評論認為它的性能是相當高的,另外一個最重要的原因是,它很小,1M不到的體積對於小型數據運用是非常方便的了。