`

SQLite 与 Access的应用比较

阅读更多

 

SQLite 与 Access的应用比较

SQLite
优点:
      (1)支持Limit语句,支持数据自动分页
      (2)支持Insert返回自动递增主键的ID
      (3)查询性能和效率高
       (4)支持压缩命令
      (6)开放源代码,可以内嵌到dll中。并且允许随意修改其源代码,并且允许不公开修改后的源代码
      (7)跨平台,数据库具有很强的兼容性
      (8)支持动态建立数据库功能
缺点:
     (1)没有一个很好的查询分析器,网上的所有的查询分析器大多都用过,感觉都没有Access那么直观。

中间:(1)事务处理,对Asp.Net用处不大,不可能在同一个连接插入大批量的数据。
(注意:事务其实就是一个批处理命令,将SqlCommand批量执行,只能处理一个连接的批处理)
=============================================

Access
优点:
       (1)具有一个直观的查询分析器(虽然不能算一个真正的查询分析器),维护相对方便
        (2)性能一般,但比较成熟和稳定
缺点:
       (1)不支持Limit命令,不能直接将数据分页输出。通用的3条select命令组合会大大降低性能
       (2)不支持Insert返回递增的ID,此问题到目前还没有一个完善的解决方案
       (3)并发性能差,最大并发数50。并且只要有一个Connection,其他连接不能修改数据
       (4)不支持压缩数据库命令
        (5)不支持动态建立数据库
       (6)不支持跨平台

以上所述,所以,在ORM 1.2版之后,暂时不支持Access扩展,全面支持SQLite。

但ORM保留了所有数据库接口,也就是要在Access扩展开发以后才会支持Access.

 

 

==================

SQLite 作为一个轻量级嵌入式数据库,还是非常好用的。雨痕极力推荐~~~~~~  

今天有个朋友测试 SQLite,然后得出的结论是:SQLite 效率太低,批量插入1000条记录,居然耗时 2 分钟!
下面是他发给我的测试代码。我晕~~~~~~

using System.Data;
using System.Data.Common;
using System.Data.SQLite;

// 创建数据库文件
File.Delete("test1.db3");
SQLiteConnection.CreateFile("test1.db3");

DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
  // 连接数据库
  conn.ConnectionString = "Data Source=test1.db3";
  conn.Open();

  // 创建数据表
  string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";
  DbCommand cmd = conn.CreateCommand();
  cmd.Connection = conn;
  cmd.CommandText = sql;
  cmd.ExecuteNonQuery();

  // 添加参数
  cmd.Parameters.Add(cmd.CreateParameter());
  
  // 开始计时
  Stopwatch watch = new Stopwatch();
  watch.Start();
  
  // 连续插入1000条记录
  for (int i = 0; i < 1000; i++)
  {
    cmd.CommandText = "insert into [test1] ([s]) values (?)";
    cmd.Parameters[0].Value = i.ToString();

    cmd.ExecuteNonQuery();
  }

  // 停止计时
  watch.Stop();
  Console.WriteLine(watch.Elapsed);
}


哎~~~~ 一个常识性的错误,我加几行代码 (新增代码标记 "// <-------------------")。

using System.Data;
using System.Data.Common;
using System.Data.SQLite;

// 创建数据库文件
File.Delete("test1.db3");
SQLiteConnection.CreateFile("test1.db3");

DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
  // 连接数据库
  conn.ConnectionString = "Data Source=test1.db3";
  conn.Open();

  // 创建数据表
  string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";
  DbCommand cmd = conn.CreateCommand();
  cmd.Connection = conn;
  cmd.CommandText = sql;
  cmd.ExecuteNonQuery();

  // 添加参数
  cmd.Parameters.Add(cmd.CreateParameter());
  
  // 开始计时
  Stopwatch watch = new Stopwatch();
  watch.Start();
  
  DbTransaction trans = conn.BeginTransaction(); // <-------------------
  try 
  {
    // 连续插入1000条记录
    for (int i = 0; i < 1000; i++)
    {
      cmd.CommandText = "insert into [test1] ([s]) values (?)";
      cmd.Parameters[0].Value = i.ToString();

      cmd.ExecuteNonQuery();
    }

    trans.Commit(); // <-------------------
  }
  catch
  {
    trans.Rollback(); // <-------------------
    throw; // <-------------------
  }

  // 停止计时
  watch.Stop();
  Console.WriteLine(watch.Elapsed);
}


执行一下,耗时 0.2 秒。这差距是不是太大了点?  

为什么只是简单启用了一个事务会有这么大的差距呢?很简单,SQLite 缺省为每个操作启动一个事务,那么原代码 1000 次插入起码开启了 1000 个事务,"事务开启 + SQL 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。

 

分享到:
评论

相关推荐

    SQLite 和Access 效率比较工具

    本文将深入探讨 SQLite 与 Access 在性能方面的差异,包括数据库创建、表建立以及大数据量插入时的速度和效率。 首先,SQLite 是一个开源的、无服务器、自包含的 SQL 数据库引擎,适用于嵌入式应用或移动设备。它不...

    Access数据库导入SQLite

    Access数据库和SQLite都是关系数据库管理系统,但它们有着不同的设计目标和应用场景。Access数据库是由微软发布的关系数据库管理系统,结合了Microsoft Jet Database Engine和图形用户界面两项特点,是Microsoft ...

    易语言源码Access转Sqlite.rar

    1. **连接Access数据库**:使用易语言提供的数据库接口,如ODBC或JDBC,建立与Access数据库的连接,读取数据表结构和数据。 2. **解析Access数据表结构**:获取表名、字段名、字段类型等元数据,这一步骤对于正确地...

    Access转Sqlite.rar

    5. 用户界面和应用程序接口:如果Access数据库有与之配套的应用程序,可能需要更新或重写这部分代码以适应SQLite API。 6. 数据库连接:在Access中,我们通常使用DAO或ADO对象来连接和操作数据库,而在SQLite,我们...

    基于Android系统的Sqlite的数据应用实例

    在实际应用中,为了提高代码可读性和可维护性,通常会将SQL操作封装成DAO(Data Access Object)类。DAO类负责与数据库的所有交互,使业务逻辑与数据访问分离,遵循单一职责原则。 此外,SQLite还支持事务处理,这...

    qt实现数据库间(sqlite到access)数据传输。

    本文将详细介绍如何使用Qt框架来实现在SQLite与Access之间进行数据迁移。Qt是一个跨平台的应用程序开发框架,支持多种数据库系统,包括SQLite和Microsoft Access。 首先,确保你的开发环境中已经安装了Qt库,并且...

    SQLite Data Access Components (LiteDAC) V5.0.2_Full Sources

    SQLite Data Access Components (LiteDAC) V5.0.2_Full Sources【5.0.2 09-Dec-21】,含全部源代码。 【SQLite数据访问组件】SQLite数据访问组件(LiteDAC)是一个组件库,它提供了来自Delphi和C ++ Builder的 ...

    Access mdb 转 sqlite 数据库java代码

    Access是微软公司的一款关系型数据库管理系统,而SQLite是一款轻量级、开源的嵌入式数据库,广泛应用于移动设备和嵌入式系统。在Java中进行这种转换可以方便地在不同的平台上操作数据,特别是在没有安装Access的情况...

    易语言将access数据库导入sqlite数据库

    SQLite则是一款轻量级、自包含的数据库引擎,广泛应用于移动设备和嵌入式系统。 将Access数据库(.mdb或.accdb文件)导入到SQLite数据库(.sqlite文件)的过程通常包括以下步骤: 1. **连接Access数据库**:首先,...

    易语言Access转Sqlite

    Access是由微软开发的关系型数据库管理系统,常用于小型企业或个人数据管理,而Sqlite则是一个轻量级、嵌入式的数据库,广泛应用于移动应用和桌面应用中。由于Sqlite具有体积小、无服务器、零配置、跨平台等优点,...

    易语言将access数据库导入sqlite数据库源码

    Access是微软开发的关系型数据库管理系统,而SQLite是一款轻量级、自包含的SQL数据库引擎,广泛应用于嵌入式系统和移动应用。 易语言提供了丰富的支持库,使得开发者可以方便地与各种数据库进行交互。在处理Access...

    全国邮编区号 access和SQLite数据库两个版本

    Access是Microsoft Office套件中的一个数据库管理系统,常用于小型企业或个人管理数据,而SQLite则是一种轻量级的、开源的、嵌入式的关系型数据库,广泛应用于移动应用、网页开发等领域。 在描述中,作者提到用代码...

    .net代码生成器,可以将sqlserver、mysql、oracle、sqlite、access等数据生成相应的实体类、三层结构、以及存储过程等操作

    本文将深入探讨标题为".net代码生成器"的工具,它能将SQL Server、MySQL、Oracle、SQLite、Access等多种数据库的数据自动生成对应的实体类、三层架构以及存储过程,极大地优化了开发流程。 首先,让我们关注这个...

    sqliteodbc驱动sqlite3

    ### SQLiteODBC 驱动 SQLite3:深入解析与应用指南 #### 一、SQLiteODBC简介 SQLiteODBC是一种连接SQLite数据库与支持ODBC(开放式数据库连接)的应用程序之间的桥梁。通过SQLiteODBC,开发人员可以利用ODBC标准...

    access_to_sqlite_e

    《Access to SQLite E: 源码解析与应用探索》 在信息技术领域,数据库系统扮演着至关重要的角色,其中SQLite以其轻量级、独立性以及跨平台的特点深受开发者喜爱。"access_to_sqlite_e"是一个专门用于访问SQLite...

    flex access sqlite libs

    这个库通常包含了SQLite的二进制文件和相应的ActionScript接口,允许Flex应用与SQLite数据库进行通信。"dba"可能是这个压缩包中的主要文件,它可能是一个包含SQLite数据库连接和操作功能的AS3类库或者是一个示例...

    sqliteodbc.zip

    通过安装这个驱动,用户可以使用任何支持ODBC的应用程序(如Microsoft Excel、Access或各种编程语言的ODBC连接器)来连接和操作SQLite数据库。 以下是一些关键知识点: 1. **SQLite**: SQLite是一个开源的、事务性...

    Access转Sqlite.zip易语言项目例子源码下载

    在实践中,开发者需要注意几个关键点:首先,Access与SQLite的数据类型可能存在差异,如Access的Date/Time类型对应SQLite的DateTime,需要进行适当的转换;其次,Access支持的VBA宏在SQLite中无法直接使用,需要将...

    sqlite for vb、vba

    标题提到的"sqlite for vb、vba"项目,是一个使VB和VBA能够直接与SQLite交互的源代码库。这个库通常包含了必要的接口和组件,以便开发者可以像操作Access或其他数据库一样操作SQLite。项目下载地址为,CodePlex是一...

Global site tag (gtag.js) - Google Analytics