Excel VBA、Access VBA连接Sqlite数据库的各种方法集锦及优缺点对比 您所在的位置:网站首页 几种方式可以执行vba程序 Excel VBA、Access VBA连接Sqlite数据库的各种方法集锦及优缺点对比

Excel VBA、Access VBA连接Sqlite数据库的各种方法集锦及优缺点对比

2023-12-13 22:27| 来源: 网络整理| 查看: 265

花了大半天的时间,对Excel VBA、Access VBA以及 vb6 连接Sqlite数据库的几种方法进行了一次汇总:

一、Sqlite数据库简介

SQLite的数据库在手机APP中使用的比较多,还有第三方共享软件也在使用这个Sqlite数据库,我自己常用的群晖Nas自带的DSNote笔记软件居然使用的也是Sqlite数据库。

以下是网络上搜索到的有关Sqlite的简明介绍:

1、SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统

它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。

2、支持跨平台

它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 TCL、C#、php、Java等,还有ODBC接口,同样比起mysql、PostgreSQL这两款开源的世界着名数据库管理系统来讲,它的处理速度比他们都快。

3、Sqlite支持内存数据库。

内存数据库让数据访问更快: 对于数据不大,使用用户不多,而对性能要求比较高的话,可以使用Sqlite数据库。

4、对比其它数据库

对比其它数据库:MySQL是完整的C/S模式的数据。监听端口,提供服务。SQLite是嵌入型数据库,不监听端口,不提供服务。换句话说MySQL是一个Server,而SQLiteL是一个lib,真的仅仅是一个库(library)。它足够轻量

5、Sqlite数据库总结

它的主要优点就是:轻量 高效 跨平台 单文件 开源

它的缺点:并发不是它的强项,非常大的数据也不建议使用它

1) 数据是否通过网络与应用程序分开? → 选择客户端/服务器

2) 多个并发用户? → 选择客户端/服务器

3)大数据? → 选择客户端/服务器

4) 否则 → 选择 SQLite!

而自己常用Access VBA和Excel VBA, 所以也希望直接使用VBA来解析SQLite数据库文件(.db文件),直接存取Sqlite数据库中的数据。

但是SQLite虽然支持各种第三方开发工具,SQLite应用也非常广泛,但SQLite的开源在VBA中无法使用,所以VB6/VBA不受Sqlite待见。如要在VBA使用sqlite数据库,还是比较麻烦。现在已知方法是使用 vbRichClient5.dll 、收费版的ODBC,还有一些开源的Sqlite库

那Excel VBA及Access VBA一般通过什么方式来连接Sqlite数据库呢?

二、Sqlite数据库相对Access及Excel的优点

Sqlite相对Excel, 那就是数据库的优点它均有。

1、Sqlite相对ACCESS的优点:

支持数据混搭(可以在一列中既有数值,也有文本),支持视图(只读),这个对多表连接很方便。支持 LIMINT 语句,分页比较方便。支持触发器,而且支持内存数据库。

详细优点以下综合了 知乎作者: 技术boy 的部分回复内容及百度的内容:

(1)支持Limit语句,支持数据自动分页 ,分页场景比较方便

(2)支持Insert返回自动递增主键的ID

(3)支持数据混搭(一列中既有数值,也有文本)

(4)查询性能和效率高

(5) 支持内存数据库

(6)支持压缩命令

(7) 跨平台,不只局限于Windows平台

(8) 代码开源

(9)支持动态建立数据库功能

2、相对Access数据库的缺点:

(1) 不像Access微软Windows内置支持库 (2) 没有Access那个方便直观易用的查询设计器 (3) 只是数据库,不像Access既是数据库,也是前端开发工具,有窗体和子窗体。

三、使用SQLite ODBC Driver方式连接

1) 在网上搜索 sqlite odbc driver 64位/32位 驱动程序,安装。一般只有不到6M,很快就安装好了

可选的下载网址: Sqlite ODBC Driver (含64位及32位)

2) 使用ADO的方式调用数据库记录集,与VBA调用Access数据库非常相似:

Dim cnn As New ADODB.Connection Dim rst As New ADODB.Recordset cnn.Open "DRIVER={SQLite3 ODBC Driver};Database=D:\\test\\test.db" Dim strSql As String Dim i As Integer strSql = "SELECT * FROM 你的表名" rst.Open strSql, cnn, 1, 1 For i = 1 to rst.RecordCount '读取或写入数据或其它相关操作 Next cnn.Execute"create table a (a, b, c);" '直接Sql操作 rst.close cnn.close

3)优点与缺点

这种方式的最大好处:就是直接使用ADO的记录集操作方式对Sqlite数据进行操作,代码与操作Access数据库几乎如出一辙,没有什么学习成本。

缺点就是必须安装ODBC驱动,另速度比原生的要稍慢点

还有个缺点就是:网上的ODBC驱动是不能加密的,加密的需要付费。

四、使用vbRichClient5.dll 和vb_cairo_sqlite.dll 方式连接

使用vbRichClient5.dll 和vb_cairo_sqlite.dll 方式连接不需要ODBC驱动,同时也可以加密数据库,并且vbRichClient5 版本更新也比较快,只是这个作者虽然技术很高,但很少宣传他的作品,文档也比较少,需要自己摸索。

1)采取引用方式需要将 vbRichClient5.dll 和 vb_cairo_sqlite.dll 一起复制到程序目录,并使用Regsvr32 对 vbRichClient5.dll 进行注册。

2)采用免注册方法使用,则还需要将 DirectCOM.dll 复制到程序目录或System(或Syswow64) 目录。

1、示例代码Public New_c As cConstructor, Cairo As cCairo Sub Main() ' InitRegfreeMode App.Path & "\Res\Dll\" Set New_c = New cConstructor frmLogin.Show End Sub Private Sub cmdOk_Click() On Error GoTo Err_Handler Dim cCnn As cConnection Dim cRs As cRecordset Dim strUserName As String Dim strPassword As String Dim blnOk As Boolean Set cCnn = New_c.Connection(gstrDbFile, DBOpenFromFile) Set cRs = cCnn.OpenRecordset("Select * from tblCfg") If Not cRs.EOF Then cRs("FMaximized") = chkMaximized.Value cRs("FIsZoom") = Me.chkIsZoom.Value cRs("FShowGroupBox") = Me.chkGroup.Value cRs.UpdateBatch End If ShowMsg "Office中国档案管理助手设置修改完成,需要重启软件才能看到效果!", "设置修改", tButOnlyOk Unload Me Exit Sub Err_Handler: ShowMsg "设置修改错误!", "设置修改", tIconError End Sub 2、优点:

不需要ODBC驱动,同时也可以加密数据库。

3、vbRichClient5.dll 和 vb_cairo_sqlite.dll 包含的主要类

(摘自 liucqa 的文章):

1)ArrayList 一个加强版的数组。

2)Cairo 中文名“开罗”。可以绘制各种东西包括窗体。内置常用的控件如:Textbox,Label,CheckBox,List,Tree等。按需加载不同的控件类,还可使用已经编译好的类库vbWidgets。也就是它提供了各种做好的半成品和各种轮子,你可以再搭建自己的控件类。

3)Connection 连接类,可连接各种数据库含 SQLite数据库,与微软ADO几乎如出一辙,还可将它的记录集(RecordSet)与微软的ADO记录集进行转换。

4)ClipBoard 控制剪贴板的类。

5)Crypt 提供了各类加密,如MD5,SHA1,Base64等,还可以使用它对文件进行压缩和解压缩。

6)FSO ,使用方法类似Scripting类库里面的FSO。

7)JasonObject Jason数据相关的类,比VBA那个json开源还要稳定些。

8)Download 可以用来下载文件的类。

9)WebServer Web服务器相关的类。

10)ImageList 和VB里面那个ImageList类似。

11)SubClass 子类化的类(VB子类化容易死机和不稳定)可使用它的这个类。

12)SortedDictionary 排序字典,对标我们常用的字典。

13)Thread 多线程(这也是Vb6的短板)

14)WebKit 创建WebKit浏览器的类。(需要额外相关文件), 随着IE浏览器的退出,这个类库也很有用途。

4、vbRichClient的使用步骤

1) VBRichClient 的引用

可手工通过注册引用该库 ,也可以不对它进行引用!就可以使用它的功能!【使用 DirectCOM 库】

2) VBRichClient 的分发

如采用引用方式使用,则需要将 vbRichClient5.dll 和 vb_cairo_sqlite.dll 一起复制到程序目录,并

对 vbRichClient5.dll 进行注册。

如果采用免注册方法使用,则还需要将 DirectCOM.dll 一并复制到程序目录或System目录。

3) VBRichClient 的使用

VBRichClient 是个相当庞大的库,需要花一些时间熟悉里面的类,最简单的办法就是使用其中的 cConstructor

类直接“生产”其它的对象。使用 DirectCOM 免注册使用,则必须使用 cConstructor 访问其他类。

dim rcConstructor as object

dim rst as object

set rcConstructor = DirectCom_Create("vbRichClient5.dll", "cConstructor")

set rst= rcConstructor.MemDB()

其它相关操作。。。。

五、使用SQLiteForExcel开源模块调用 SQLite3_StdCall.dll方式连接

SqliteForExcel 针对Excel 直连Sqlite数据库的开源模块:项目下载网址

此模块适用于Excel VBA 及Access VBA

1) SqliteForExcel 概述

SQLite是一个小型、易于使用的开源 SQL 数据库引擎。这个项目SQLite for Excel是一个轻量级的包装器,可以从 VBA 访问 SQLite3 库。它提供了通往 SQLite3 API 函数的高性能路径,保留了 SQLite3 库调用的语义,并允许在不重新编译的情况下访问分布式 SQLite3.dll。

2) SqliteForExcel 发布详情

当前版本包含以下部分:

分发目录

ChangeLog.txt包含每个版本中更改的详细信息。

SQLite3_StdCall.dll是一个小而非常简单的 C .dll,可以使用 VBA 中的标准 SQLite3 .dll。它只是将调用从 VBA 传递到 SQLite,而不会更改参数,但这允许 VB6 和 VBA 仅限于的 StdCall 调用约定。

SQLiteForExcel.xls包含两个 VBA 模块:

SQLite3.bas VBA 模块具有所有的 VBA 声明,并进行参数和字符串转换。它公开了许多 SQLite3xxxx 函数。这些映射尽可能直接地映射到 SQLite C API,语义没有变化。虽然我没有公开完整的API,但包含了大部分核心接口,特别是准备好的语句、绑定、检索和备份功能。日期值作为儒略日实数存储在数据库中。

SQLite3Demo.bas VBA 模块具有作为如何使用 SQLite3xxxx 函数的很好示例的测试。

SQLiteForExcel_64.xlsm在一个版本中包含两个 VBA 模块的 64 位版本,同时支持 32 位和 64 位版本的 Excel。相应的 {"Sqlite3Demo_64.bas"} 模块显示了如何同时针对 32 位和 64具有相同 VBA 代码的位 Excel(需要一些 #Ifs)。(请注意,Office 的默认安装始终是 32 位版本,即使在 64 位版本的 Windows 上也是如此。只有在明确选择了 64 位版本的 Office 时才需要 64 位模块。)

sqlite3.dll是从 SQLite 网站下载的 SQLite 版本 3.11.1 的副本。

x64\SQLite3.dll是 SQLite 3.11.1 的 64 位版本。

3) SqliteForExcel 源程序目录

SQLite3VBAModules包含描述的四个 VBA 模块(32 位和 64 位)。

SQLite3_StdCall包含上述库的 C 语言源代码。

4)调用代码示例(示例文件里有更多示例代码) Public Sub TestInsert() #If Win64 Then Dim myDbHandle As LongPtr Dim myStmtHandle As LongPtr #Else Dim myDbHandle As Long Dim myStmtHandle As Long #End If Dim RetVal As Long Dim recordsAffected As Long Dim stepMsg As String Debug.Print "----- TestInsert Start -----" ' Open the database - getting a DbHandle back RetVal = SQLite3Open(TestFile, myDbHandle) Debug.Print "SQLite3Open returned " & RetVal '------------------------ ' Create the table ' ================ ' Create the sql statement - getting a StmtHandle back RetVal = SQLite3PrepareV2(myDbHandle, "CREATE TABLE MySecondTable (TheId INTEGER, TheText TEXT, TheValue REAL)", myStmtHandle) Debug.Print "SQLite3PrepareV2 returned " & RetVal ' Start running the statement RetVal = SQLite3Step(myStmtHandle) If RetVal = SQLITE_DONE Then Debug.Print "SQLite3Step Done" Else Debug.Print "SQLite3Step returned " & RetVal End If ' Finalize (delete) the statement RetVal = SQLite3Finalize(myStmtHandle) Debug.Print "SQLite3Finalize returned " & RetVal '------------------------- ' Insert a record ' =============== ' Create the sql statement - getting a StmtHandle back RetVal = SQLite3PrepareV2(myDbHandle, "INSERT INTO MySecondTable Values (123, 'ABC', 42.1)", myStmtHandle) Debug.Print "SQLite3PrepareV2 returned " & RetVal ' Start running the statement RetVal = SQLite3Step(myStmtHandle) If RetVal = SQLITE_DONE Then Debug.Print "SQLite3Step Done" Else Debug.Print "SQLite3Step returned " & RetVal End If ' Finalize (delete) the statement RetVal = SQLite3Finalize(myStmtHandle) Debug.Print "SQLite3Finalize returned " & RetVal '------------------------- ' Insert using helper ' ==================== recordsAffected = SQLite3ExecuteNonQuery(myDbHandle, "INSERT INTO MySecondTable Values (456, 'DEF', 49.3)") Debug.Print "SQLite3Execute - Insert affected " & recordsAffected & " record(s)." ' Close the database RetVal = SQLite3Close(myDbHandle) Kill TestFile Debug.Print "----- TestInsert End -----" End Sub

这个方法优点是直连速度更快,无须安装ODBC驱动。缺点是使用方法不是标准的ADO方式。需要习惯写法。

六、避坑指南1、安装ODBC驱动时,一定要注意安装你Office对应的32位或者64位版本。

这个跟安装Access database engine是一个道理

2、如果你的数据量不大,且习惯ADO,建议使用第四种方式3、使用第5种方法 SQLite3_StdCall.dll 和sqlite3.dll需复制到程序所在目录

这里需要注意,微软Excel会自动搜索xlsm所在目录下的2个dll文件,但WPS并不会,如果需要在WPS VBA中使用,需要显式指全2个dll的完整路径才行。

以上就是有关VBA如何访问Sqlite数据库的全部内容及各种方法总结。可先收藏起来,避免走丢。

码字不易,如果对您有用,请帮忙点个赞 收藏 及关注我们 @小辣椒高效Office



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有