C#中数据本地存储方案之SQLite

开发 后端
今天我们将讨论的是C#中数据本地存储方案之SQLite,这一方案较之前的Access方案有更多的好处。

即使是做网络应用,在断线情况下,也需要考虑数据的本地存储。在SQLite出现之前,数据量大的情况下,我们一直使用ACCESS,数据量小,则文件存储。ACCESS不支持事务原子性,在断电情况下(这种情况总是会发生)会导致数据很难恢复。

一:安装

SQLITE,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统。我直接使用的是http://sqlite.phxsoftware.com/(An open source ADO.NET provider for the SQLite database engine)。下载完毕是一个EXE,安装后根目录如下:

clip_image002

Bin下有一个测试工具,可以查看本地运行SQLITE的各项性能指标。

二:新建数据库

安装完毕后,打开visual studio,新建数据连接,可以看到数据源多了一项SQLite。

clip_image004

新建连接,如下图。SQLITE的数据库,保存后是一个文件。

clip_image006

三:数据库维护

可以在Visual Studio中方面的维护SQLITE数据,如下图:

clip_image008

可以在Visual Studio中使用类似SQL查询分析器的功能,如下图:

clip_image010

四:混合模式

安装完毕,可以直接在项目集的引用中,多了

System.Data.SQLite

System.Data.SQLite.Linq

两个程序集,由于http://sqlite.phxsoftware.com/的System.Data.SQLite是混合模式程序集,是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。故需要在App.config中配置如下参数。

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3.   <startup useLegacyV2RuntimeActivationPolicy="true"> 
  4.     <supportedRuntime version="v4.0"/> 
  5.   </startup> 
  6. </configuration> 

五:SQLiteHelper

最后,提供一个自己写的SQLiteHelper:

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Data.SQLite;  
  6. using System.Data;  
  7. using System.Data.Common;  
  8.  
  9. namespace Com.Luminji.DataService.SQLHelpers  
  10. {  
  11.     public class SQLiteHelper  
  12.     {  
  13.         /// <summary>  
  14.         /// ConnectionString样例:Datasource=Test.db3;Pooling=true;FailIfMissing=false  
  15.         /// </summary>  
  16.         public static string ConnectionString { getset; }  
  17.  
  18.         private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, params object[] p)  
  19.         {  
  20.             if (conn.State != ConnectionState.Open)  
  21.                 conn.Open();  
  22.             cmd.Parameters.Clear();  
  23.             cmd.Connection = conn;  
  24.             cmd.CommandText = cmdText;  
  25.             cmd.CommandType = CommandType.Text;  
  26.             cmd.CommandTimeout = 30;  
  27.             if (p != null)  
  28.             {  
  29.                 foreach (object parm in p)  
  30.                     cmd.Parameters.AddWithValue(string.Empty, parm);  
  31.             }  
  32.         }  
  33.  
  34.         public static DataSet ExecuteQuery(string cmdText, params object[] p)  
  35.         {  
  36.             using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))  
  37.             {  
  38.                 using (SQLiteCommand command = new SQLiteCommand())  
  39.                 {  
  40.                     DataSet ds = new DataSet();  
  41.                     PrepareCommand(command, conn, cmdText, p);  
  42.                     SQLiteDataAdapter da = new SQLiteDataAdapter(command);  
  43.                     da.Fill(ds);  
  44.                     return ds;  
  45.                 }  
  46.             }  
  47.         }  
  48.  
  49.         public static int ExecuteNonQuery(string cmdText, params object[] p)  
  50.         {  
  51.             using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))  
  52.             {  
  53.                 using (SQLiteCommand command = new SQLiteCommand())  
  54.                 {  
  55.                     PrepareCommand(command, conn, cmdText, p);  
  56.                     return command.ExecuteNonQuery();  
  57.                 }  
  58.             }  
  59.         }  
  60.  
  61.         public static SQLiteDataReader ExecuteReader(string cmdText, params object[] p)  
  62.         {  
  63.             using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))  
  64.             {  
  65.                 using (SQLiteCommand command = new SQLiteCommand())  
  66.                 {  
  67.                     PrepareCommand(command, conn, cmdText, p);  
  68.                     return command.ExecuteReader(CommandBehavior.CloseConnection);  
  69.                 }  
  70.             }  
  71.         }  
  72.  
  73.         public static object ExecuteScalar(string cmdText, params object[] p)  
  74.         {  
  75.             using (SQLiteConnection conn = new SQLiteConnection(ConnectionString))  
  76.             {  
  77.                 using (SQLiteCommand command = new SQLiteCommand())  
  78.                 {  
  79.                     PrepareCommand(command, conn, cmdText, p);  
  80.                     return command.ExecuteScalar();  
  81.                 }  
  82.             }  
  83.         }  
  84.  
  85.     }  

六:附注

SQLite官方网站: http://www.sqlite. org/ 时第一眼看到关于SQLite的特性。

1. ACID事务

2. 零配置 – 无需安装和管理配置

3. 储存在单一磁盘文件中的一个完整的数据库

4. 数据库文件可以在不同字节顺序的机器间自由的共享

5. 支持数据库大小至2TB

6. 足够小, 大致3万行C代码, 250K

7. 比一些流行的数据库在大部分普通数据库操作要快

8. 简单, 轻松的API

9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定

10. 良好注释的源代码, 并且有着90%以上的测试覆盖率

11. 独立: 没有额外依赖

12. Source完全的Open, 你可以用于任何用途, 包括出售它

13. 支持多种开发语言,C, PHP, Perl, Java, ASP .NET,Python

原文链接:http://www.cnblogs.com/luminji/archive/2010/12/19/1910396.html

【编辑推荐】

  1. C#取整函数实例应用详解
  2. C#单元测试的一个小故事
  3. C#单元测试概念及作用的浅析
  4. C#单元测试使用的必要性的浅析
  5. C#单元测试的运行浅析
责任编辑:彭凡 来源: 博客园
相关推荐

2024-09-20 18:02:42

C#数据库SQLite

2024-05-06 06:00:00

C#文件存储

2018-07-13 09:20:30

SQLite数据库存储

2024-02-28 08:06:17

2022-12-29 08:57:34

Android本地数据存储

2022-06-01 07:33:29

数据存储加密

2011-07-06 11:04:42

C#正则表达式

2009-08-25 17:59:49

C#入门

2012-12-24 09:14:31

ios

2009-08-17 13:49:20

C#中调用Window

2009-08-13 17:58:34

C#存储过程

2009-09-04 14:01:30

C#存储BLOB对象

2009-08-25 16:29:33

C#使用sqlserv

2024-01-02 13:26:39

TLSC#线程

2009-08-25 16:32:24

C#语言

2021-03-15 08:18:23

C#反射模块

2011-05-18 10:21:53

SQLite

2009-08-12 18:35:17

C#数据结构

2023-05-08 15:21:05

JavaScripWeb 存储数据存储

2013-04-10 14:21:35

点赞
收藏

51CTO技术栈公众号