即使是做网络应用,在断线情况下,也需要考虑数据的本地存储。在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。
三:数据库维护
可以在VS中方面的维护sqlITE数据,如下图:
四:混合模式
安装完毕,可以直接在项目集的引用中,多了
System.Data.sqlite
System.Data.sqlite.Linq
两个程序集,由于http://sqlite.phxsoftware.com/的System.Data.sqlite是混合模式程序集,是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。故需要在App.config中配置如下参数。
@H_403_54@<?xml version="1.0" encoding="utf-8" @H_403_54@?> @H_403_54@<configuration@H_403_54@> @H_403_54@<startup useLegacyV2RuntimeActivationPolicy=@H_403_54@"true"@H_403_54@> @H_403_54@<supportedRuntime version=@H_403_54@"v4.0"@H_403_54@/> @H_403_54@</startup@H_403_54@> @H_403_54@</configuration@H_403_54@>
五:sqliteHelper
最后,提供一个自己写的sqliteHelper:
@H_403_54@using System; @H_403_54@using System.Collections.Generic; @H_403_54@using System.Linq; @H_403_54@using System.Text; @H_403_54@using System.Data.sqlite; @H_403_54@using System.Data; @H_403_54@using System.Data.Common; @H_403_54@namespace Com.Luminji.DataService.sqlHelpers { @H_403_54@public @H_403_54@class sqliteHelper { /// <summary> /// ConnectionString样例:Data Source=Test.db3;Pooling=true;FailIfMissing=false /// </summary> @H_403_54@public @H_403_54@static @H_403_54@string ConnectionString { @H_403_54@get; @H_403_54@set; } @H_403_54@private @H_403_54@static @H_403_54@void PrepareCommand(sqliteCommand cmd,sqliteConnection conn,@H_403_54@string cmdText,@H_403_54@params @H_403_54@object[] p) { @H_403_54@if (conn.State != ConnectionState.Open) conn.Open(); cmd.Parameters.Clear(); cmd.Connection = conn; cmd.CommandText = cmdText; cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 30; @H_403_54@if (p != @H_403_54@null) { @H_403_54@foreach (@H_403_54@object parm @H_403_54@in p) cmd.Parameters.AddWithValue(@H_403_54@string.Empty,parm); } } @H_403_54@public @H_403_54@static DataSet ExecuteQuery(@H_403_54@string cmdText,@H_403_54@params @H_403_54@object[] p) { @H_403_54@using (sqliteConnection conn = @H_403_54@new sqliteConnection(ConnectionString)) { @H_403_54@using (sqliteCommand command = @H_403_54@new sqliteCommand()) { DataSet ds = @H_403_54@new DataSet(); PrepareCommand(command,conn,cmdText,p); sqliteDataAdapter da = @H_403_54@new sqliteDataAdapter(command); da.Fill(ds); @H_403_54@return ds; } } } @H_403_54@public @H_403_54@static @H_403_54@int ExecuteNonQuery(@H_403_54@string cmdText,@H_403_54@params @H_403_54@object[] p) { @H_403_54@using (sqliteConnection conn = @H_403_54@new sqliteConnection(ConnectionString)) { @H_403_54@using (sqliteCommand command = @H_403_54@new sqliteCommand()) { PrepareCommand(command,p); @H_403_54@return command.ExecuteNonQuery(); } } } @H_403_54@public @H_403_54@static sqliteDataReader ExecuteReader(@H_403_54@string cmdText,p); @H_403_54@return command.ExecuteReader(CommandBehavior.CloseConnection); } } } @H_403_54@public @H_403_54@static @H_403_54@object ExecuteScalar(@H_403_54@string cmdText,p); @H_403_54@return command.ExecuteScalar(); } } } } }