C#数据本地存储方案之SQLite
即使是做网络应用,在断线情况下,也需要考虑数据的本地存储。在SQLite出现之前,数据量大的情况下,我们一直使用ACCESS,数据量小,则文件存储。ACCESS不支持事务原子性,在断电情况下(这种情况总是会发生)会导致数据很难恢复。
一:安装
SQLITE,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统。我直接使用的是http://sqlite.phxsoftware.com/(An open source ADO.NET provider for the SQLite database engine)。下载完毕是一个EXE,安装后根目录如下:
PS: UPDATED IN 2013-06-04,原网站已经不存在,现在已经更新到:http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki
Bin下有一个测试工具,可以查看本地运行SQLITE的各项性能指标。
二:新建数据库
安装完毕后,打开visual studio,新建数据连接,可以看到数据源多了一项SQLite。
新建连接,如下图。SQLITE的数据库,保存后是一个文件。
三:数据库维护
可以在VS中方面的维护SQLITE数据,如下图:
可以在VS中使用类似SQL查询分析器的功能,如下图:
四:混合模式
安装完毕,可以直接在项目集的引用中,多了
System.Data.SQLite
System.Data.SQLite.Linq
两个程序集,由于http://sqlite.phxsoftware.com/的System.Data.SQLite是混合模式程序集,是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。故需要在App.config中配置如下参数。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> </configuration>
五:SQLiteHelper
最后,提供一个自己写的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样例:Data Source=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(); } } } } }