zoukankan      html  css  js  c++  java
  • C#数据本地存储方案之SQLite

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

    三:数据库维护

    可以在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
  • 相关阅读:
    Altium Designer 快捷键与技巧
    常用贴片三极管型号与丝印的对应关系(SOT23)
    buck型DC-DC分析
    IAR升级之后,编译stm32官方工程报错的解决办法
    单片机中不带字库LCD液晶屏显示少量汉字
    结构体应用及其字节对齐问题
    退出循环break,continue,return,goto分析
    金莎伪粉丝的日常
    keil5 mdk使用ST-Link II下载出现cannot halt the core解决办法
    keil5 mdk调用外部编辑器notepad++、sublime3、VSCode总结
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/2443994.html
Copyright © 2011-2022 走看看