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

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

即使是做网络应用,在断线情况下,也需要考虑数据的本地存储。在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

clip_image002

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

 

二:新建数据库

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

clip_image004

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

clip_image006

 

三:数据库维护

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

clip_image008

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

clip_image010

 

四:混合模式

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

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();
                }
            }
        }

    }
}
 
六:附注
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
 
微信扫一扫,关注最课程( www.zuikc.com),获取更多我的文章,获取软件开发每日一练
 
 
Creative Commons License本文基于 Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 http://www.cnblogs.com/luminji(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
目录
相关文章
|
2月前
|
存储 缓存 关系型数据库
MySQL原理简介—5.存储模型和数据读写机制
本文介绍了MySQL中InnoDB存储引擎的物理存储结构和读写机制。主要内容包括: 1. 为什么不能直接更新磁盘上的数据 2. 数据页的概念 3. 一行数据的存储 4. 数据头的内容 5. 行溢出和溢出页 6. 数据页的物理结构 7. 表空间的物理结构 8. InnoDB存储模型及读写机制总结 这些机制共同确保了InnoDB在高并发场景下的高效运行和数据一致性。
|
7月前
|
存储 关系型数据库 MySQL
深入解析MySQL数据存储机制:从表结构到物理存储
深入解析MySQL数据存储机制:从表结构到物理存储
963 1
|
11月前
|
存储 对象存储 块存储
高性能数据存储有哪些方式
高性能数据存储有哪些方式
195 0
|
存储 SQL 缓存
内核干货 | 数据库存储引擎如何利用好CPU缓存?
本文探讨如何优化X-Engine中DataBlock内部的记录编码格式,以降低在DataBlock中查找单条记录时的CPU cache miss次数,最终目标是提升DataBlock点查询性能。
940 0
内核干货 | 数据库存储引擎如何利用好CPU缓存?
|
SQL 存储 Java
数据存储之-SQLite数据库一
数据存储之-SQLite数据库一
187 0
|
存储 数据库 数据库管理
数据存储之-SQLite数据库二
数据存储之-SQLite数据库二
11818 0
|
存储 SQL 缓存
|
存储 JSON API
|
存储 缓存 前端开发
前端本地存储数据库IndexedDB完整教程
前言 在人们的印象中,可能觉得只有做后端的小伙伴才会接触到数据库。其实在前端的领域里面也有数据库,只是可能用的比较少,因为前端存储方案有很多,比如cookie、sessionstorage等等。 在浏览器上有两种数据库:webSQL和IndexedDB。但是如果在浏览器上需要用到数据库一般会使用Indexed DB数据库,webSQL基本上已经废弃了,具体原因小伙伴可以下来自己查查,今天主要就讲解Indexed DB数据库的使用。
1795 0
前端本地存储数据库IndexedDB完整教程
下一篇
oss创建bucket