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

系统 1827 0

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

本文出处: http://www.cnblogs.com/luminji/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论