技术开发 频道

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

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

  一:安装

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

1
 

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

  二:新建数据库

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

1
 

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

1
 

  三:数据库维护

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

1
 

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

1
 

  四:混合模式

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

  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样例:Datasource=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

0
相关文章