C#中數(shù)據(jù)本地存儲(chǔ)方案之SQLite
即使是做網(wǎng)絡(luò)應(yīng)用,在斷線情況下,也需要考慮數(shù)據(jù)的本地存儲(chǔ)。在SQLite出現(xiàn)之前,數(shù)據(jù)量大的情況下,我們一直使用ACCESS,數(shù)據(jù)量小,則文件存儲(chǔ)。ACCESS不支持事務(wù)原子性,在斷電情況下(這種情況總是會(huì)發(fā)生)會(huì)導(dǎo)致數(shù)據(jù)很難恢復(fù)。
一:安裝
SQLITE,是一款輕型的數(shù)據(jù)庫(kù),是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理系統(tǒng)。我直接使用的是http://sqlite.phxsoftware.com/(An open source ADO.NET provider for the SQLite database engine)。下載完畢是一個(gè)EXE,安裝后根目錄如下:
Bin下有一個(gè)測(cè)試工具,可以查看本地運(yùn)行SQLITE的各項(xiàng)性能指標(biāo)。
二:新建數(shù)據(jù)庫(kù)
安裝完畢后,打開(kāi)visual studio,新建數(shù)據(jù)連接,可以看到數(shù)據(jù)源多了一項(xiàng)SQLite。
新建連接,如下圖。SQLITE的數(shù)據(jù)庫(kù),保存后是一個(gè)文件。
三:數(shù)據(jù)庫(kù)維護(hù)
可以在Visual Studio中方面的維護(hù)SQLITE數(shù)據(jù),如下圖:
可以在Visual Studio中使用類似SQL查詢分析器的功能,如下圖:
四:混合模式
安裝完畢,可以直接在項(xiàng)目集的引用中,多了
System.Data.SQLite
System.Data.SQLite.Linq
兩個(gè)程序集,由于http://sqlite.phxsoftware.com/的System.Data.SQLite是混合模式程序集,是針對(duì)“v2.0.50727”版的運(yùn)行時(shí)生成的,在沒(méi)有配置其他信息的情況下,無(wú)法在 4.0 運(yùn)行時(shí)中加載該程序集。故需要在App.config中配置如下參數(shù)。
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <startup useLegacyV2RuntimeActivationPolicy="true">
- <supportedRuntime version="v4.0"/>
- </startup>
- </configuration>
五:SQLiteHelper
最后,提供一個(gè)自己寫(xiě)的SQLiteHelper:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Data.SQLite;
- using System.Data;
- using System.Data.Common;
- namespace Com.Luminji.DataService.SQLHelpers
- {
- public class SQLiteHelper
- {
- /// <summary>
- /// ConnectionString樣例:Datasource=Test.db3;Pooling=true;FailIfMissing=false
- /// </summary>
- public static string ConnectionString { get; set; }
- private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] p)
- {
- if (conn.State != ConnectionState.Open)
- conn.Open();
- cmd.Parameters.Clear();
- cmd.Connection = conn;
- cmd.CommandText = cmdText;
- cmd.CommandType = CommandType.Text;
- cmd.CommandTimeout = 30;
- if (p != null)
- {
- foreach (object parm in p)
- cmd.Parameters.AddWithValue(string.Empty, parm);
- }
- }
- public static DataSet ExecuteQuery(string cmdText, params object[] p)
- {
- using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
- {
- using (SQLiteCommand command = new SQLiteCommand())
- {
- DataSet ds = new DataSet();
- PrepareCommand(command, conn, cmdText, p);
- SQLiteDataAdapter da = new SQLiteDataAdapter(command);
- da.Fill(ds);
- return ds;
- }
- }
- }
- public static int ExecuteNonQuery(string cmdText, params object[] p)
- {
- using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
- {
- using (SQLiteCommand command = new SQLiteCommand())
- {
- PrepareCommand(command, conn, cmdText, p);
- return command.ExecuteNonQuery();
- }
- }
- }
- public static SQLiteDataReader ExecuteReader(string cmdText, params object[] p)
- {
- using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
- {
- using (SQLiteCommand command = new SQLiteCommand())
- {
- PrepareCommand(command, conn, cmdText, p);
- return command.ExecuteReader(CommandBehavior.CloseConnection);
- }
- }
- }
- public static object ExecuteScalar(string cmdText, params object[] p)
- {
- using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))
- {
- using (SQLiteCommand command = new SQLiteCommand())
- {
- PrepareCommand(command, conn, cmdText, p);
- return command.ExecuteScalar();
- }
- }
- }
- }
- }
六:附注
SQLite官方網(wǎng)站: http://www.sqlite. org/ 時(shí)第一眼看到關(guān)于SQLite的特性。
1. ACID事務(wù)
2. 零配置 – 無(wú)需安裝和管理配置
3. 儲(chǔ)存在單一磁盤(pán)文件中的一個(gè)完整的數(shù)據(jù)庫(kù)
4. 數(shù)據(jù)庫(kù)文件可以在不同字節(jié)順序的機(jī)器間自由的共享
5. 支持?jǐn)?shù)據(jù)庫(kù)大小至2TB
6. 足夠小, 大致3萬(wàn)行C代碼, 250K
7. 比一些流行的數(shù)據(jù)庫(kù)在大部分普通數(shù)據(jù)庫(kù)操作要快
8. 簡(jiǎn)單, 輕松的API
9. 包含TCL綁定, 同時(shí)通過(guò)Wrapper支持其他語(yǔ)言的綁定
10. 良好注釋的源代碼, 并且有著90%以上的測(cè)試覆蓋率
11. 獨(dú)立: 沒(méi)有額外依賴
12. Source完全的Open, 你可以用于任何用途, 包括出售它
13. 支持多種開(kāi)發(fā)語(yǔ)言,C, PHP, Perl, Java, ASP .NET,Python
原文鏈接:http://www.cnblogs.com/luminji/archive/2010/12/19/1910396.html
【編輯推薦】