• 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

    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(包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
  • 相关阅读:
    将php中stat()得到的文件权限转成Linux形式
    Linux终端命令快捷键
    我的测试博客
    java 的反射机制- 代码讲解
    毕业有感
    COPD——团队项目测试心得
    慢阻肺疾病管理APP——第一次迭代心得
    团队项目需求心得——慢阻肺疾病管理APP
    合作和共赢的结对编程——中小学试卷生成器
    项目组队——欣赏与批判队友个人项目源码
  • 原文地址:https://www.cnblogs.com/luminji/p/1910396.html
Copyright © 2020-2023  润新知