Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VBA与数据库——写个类操作ADO_打开数据库

VBA与数据库——写个类操作ADO_打开数据库

作者头像
xyj
发布于 2021-11-12 07:14:16
发布于 2021-11-12 07:14:16
3K00
代码可运行
举报
文章被收录于专栏:VBA 学习VBA 学习
运行总次数:0
代码可运行

在前面介绍的一些操作数据库的代码中,可以看到,主要的操作逻辑基本上是打开数据库-操作-关闭数据库,很多时候改变的仅仅是操作,所以,把这些封装到一个类里面,以后调用自己写的类就会更方便。

因为ADO这个东西不仅仅只有Excel VBA可以调用,只要能调用COM组件的语言都是可以使用的,所以ADO实现的方法和属性都是通用性的,对于使用Excel VBA的人来说,有些时候为了方便在Excel里使用,自然需要做进一步的处理。

使用VBAProject管理类代码

我个人是习惯使用VBAProject来管理代码的,新建一个.xlam加载宏文件,插入类模块,命名CADO,设置Instancing=2,添加引用:

Microsoft ActiveX Data Objects #.# Library

#.#代表的是版本号,使用自己电脑的最高版本即可。

添加这个引用的目的是为了使用前期绑定,方便输代码,因为使用了VBAProject来管理代码,以后其他文件需要操作数据库都添加引用这个文件即可,不会再需要添加引用ADO。

类模块顶部声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'函数的返回值,0表示成功
Private Enum RetCode
    RetSucce = 0
    RetErr
End Enum
Private AdoConn As ADODB.Connection
'用来返回错误,通过GetErr函数
Private StrErr As String

然后输入类的初始、销毁代码,主要就是声明ADODB.Connection以及关闭数据库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Private Sub Class_Initialize()
    Set AdoConn = New ADODB.Connection
End Sub

Private Sub Class_Terminate()
    If AdoConn.State = adStateOpen Then AdoConn.Close
    Set AdoConn = Nothing
End Sub

插入模块,命名MAPI,输入代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Public Function NewCADO() As CADO
    Set NewCADO = New CADO
End Function

准备工作就结束了。

实现OpenDB

打开数据库就是调用ADO的Open方法,在打开的时候,主要是需要写好Provider字符串,前面基本上是使用Excel来做测试的,但是数据库有很多种,不同的数据库Provider字符串是不一样的,希望的OpenDB函数就是可以根据输入的数据库信息,自动构建好Provider字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Function OpenDB(dbSrc As String) As Long
    On Error GoTo errHandle
    
    If AdoConn.State = adStateOpen Then AdoConn.Close
    
    AdoConn.Open GetProvider(dbSrc)
    OpenDB = RetCode.RetSucce
    
    Exit Function
errHandle:
    StrErr = Err.Description
    OpenDB = RetCode.RetErr
End Function

Private Function GetProvider(dbSrc As String) As String
    '开头如果是Provider,那就是已经写好了连接语句
    If VBA.LCase$(VBA.Left$(dbSrc, 8)) = "provider" Then
        GetProvider = dbSrc
        Exit Function
    End If
    
    '否则按照文件的后缀来处理
    Dim strExt As String
    strExt = GetExt(dbSrc)
'    没有后缀的文件,尝试使用文件的前面部分字节来判断
    If VBA.Len(strExt) = 0 Then strExt = GetExtByBin(dbSrc)
    
    strExt = VBA.LCase$(strExt)
    
    Select Case strExt
    Case "xls", "xlsx", "xlsm", "xlsb"
        GetProvider = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & dbSrc
        GetProvider = GetProvider & ";Extended Properties=""Excel 12.0;HDR=YES"";"
        
    Case "mdb", "accdb"
        GetProvider = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" & dbSrc
        
    Case "udl"
        GetProvider = "File Name=" & dbSrc
    
    Case "sqlite"
        '个人习惯使用的sqlite数据库的后缀
        GetProvider = "Provider=SQLITEDB;Data Source=" & dbSrc
        
    End Select
End Function

Private Function GetExt(ByVal FullPath As String) As String
    Dim i As Long
    '先找到文件名,避免一下路径中可能存在的"."
    FullPath = GetName(FullPath)
    
    i = VBA.InStrRev(FullPath, ".")
    If i Then
        GetExt = VBA.Mid$(FullPath, i + 1)
    Else
        GetExt = ""
    End If
End Function

Private Function GetName(ByVal FullPath As String) As String
    Dim i As Long
    i = VBA.InStrRev(FullPath, "\")
    
    If i Then
        GetName = VBA.Mid$(FullPath, i + 1)
    Else
        GetName = FullPath
    End If
End Function

Private Function GetExtByBin(dbPath As String) As String
    Dim b() As Byte
    ReDim b(&H12) As Byte
    
    ReadTxtByOpenBin dbPath, b
    
    Dim str As String
    str = VBA.StrConv(b, vbUnicode)
    
    If VBA.InStr(str, "SQLite format 3") Then
        GetExtByBin = "sqlite"
    ElseIf VBA.InStr(str, "Standard Jet DB") Then
        GetExtByBin = "mdb"
    ElseIf VBA.InStr(str, "Standard ACE DB") Then
        GetExtByBin = "accdb"
        
    ElseIf VBA.Left$(str, 2) = "PK" Then
        'TODO 判断的过于简单
        GetExtByBin = "xlsx"
        
    Else
        GetExtByBin = ""
    End If
End Function

Private Function ReadTxtByOpenBin(txtName As String, b() As Byte) As Long
    Dim num_file As Integer
    
    num_file = VBA.FreeFile
    
    Open txtName For Binary Access Read As #num_file
    Get #num_file, 1, b
    
    Close #num_file
End Function

GetProvider函数把一些常用的连接语句都做到了这个函数中,在外部只需要传入对应的文件路径或者是使用udl文件描述的连接语句都可以。

测试:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VBA与数据库——写个类操作ADO_读取表名
ADO的Connection对象有一个OpenSchema方法,能够获取数据库的很多信息,比如表的名称等信息、字段的名称等信息,具体可以查看SchemaEnum枚举类型。
xyj
2021/12/01
9270
VBA与数据库——写个类操作ADO_操作数据库
操作数据库有增加、修改、删除、查询记录等,在前面的例子中,用的基本都是查询,这种是需要得到结果数据的,另外几种是修改数据库里的数据,很多时候是不需要返回数据的。
xyj
2021/11/12
1.2K0
VBA与数据库——写个类操作ADO_使用RecordSet创建透视表
在Excel中,数据透视表是一个非常强大的工具,而且非常适合普通人使用,不需要有什么高深技巧,通过一些拖拽操作就能够完成较为复杂的数据汇总、分析等操作。
xyj
2021/12/01
2K0
VBA与数据库——写个类操作ADO_使用RecordSet创建透视表
VBA与数据库——简化程序编写-筛选
要对Excel数据进行筛选,最容易想到的方法自然是Excel本身的数据-筛选功能,但是如果是要在VBA中对数据进行筛选,那么一般的做法是对数据进行循环遍历,把符合条件的数据提取出来,假如数据是这样的:
xyj
2021/07/20
1.1K0
VBA与数据库——排列组合(可重复)
在VBA实现排列组合(可重复)中使用普通的VBA编程方法,实现了排列组合(可重复),代码虽然不是很多,但作为初学者需要理解还是有一定难度的。
xyj
2021/10/20
1.3K0
VBA与数据库——简化程序编写-一维表转二维表
在一维表转二维表里介绍了使用字典来转换表格的方法,可以看到使用字典的方法代码量还是有一点多的,有点复杂。
xyj
2021/07/20
8590
VBA与数据库——Excel
一说到数据库,一般都会想到那些很专业的数据库,其实Excel本身也可以作为数据库来使用。
xyj
2021/04/26
2.7K0
VBA与数据库——Excel
VBA与数据库——合并表格
在Excel里,如果需要把多个工作表或者工作簿的数据合并到一起,用VBA来做一个程序还是比较容易的,在多个工作簿合并到一个工作簿和多个工作表合并到一个工作表里有过介绍,代码不算很复杂。
xyj
2021/09/10
5K2
VBA与数据库——合并表格
VBA与数据库——简化程序编写-去重
代码和汇总、查找数据等一样,仅仅是修改了sql语句,相比使用字典,代码更加的简单,在需要更换去重字段条件的时候,也更加的方便。
xyj
2021/08/13
1.6K2
VBA创建多个数据源的数据透视表
比如要分析工资的数据,工资表是按月分了不同Sheet管理的,现在需要把12个月的数据放到一起创建1个数据透视表。
xyj
2020/07/28
3.5K0
VBA创建多个数据源的数据透视表
VBA与数据库——合并表格并删除重复
在前面合并表格里提到,用union all关键字进行合并数据,union all只是简单的将所有的数据进行复制到一起,不做其他的处理。
xyj
2021/09/10
4.7K3
VBA与数据库——合并表格并删除重复
VBA与数据库——写个类操作ADO_读取字段信息
像读取表名那样,很多数据库都有特定的sql语句,但是又存在返回的信息不统一的问题,特别是对字段类型的描述,不同数据库之间差异较大。
xyj
2022/03/29
6070
VBA与数据库——简化程序编写-查找
比较简单的一段代码,和汇总数据一样,这里只是按照一个条件进行查找,需要按照2个甚至多个条件来查找的时候,需要改动的代码有:
xyj
2021/07/20
9710
VBA与数据库——简化程序编写-汇总
我们在使用VBA处理Excel数据的时候,很多时候就是对数据进行分类汇总、查找等等。一般这种功能都是使用字典来实现,比如汇总数据功能。
xyj
2021/06/22
1.3K0
VBA与数据库——简化程序编写-汇总
VBA与数据库——简化程序编写-拼接表格
需要实现这个功能,在VBA里首先想到的应该还是字典,首先将表格2中的字段对应关系记录到字典,然后在表格1基础上增加一列,遍历表格1,利用字典将字段A对应的字段C读取出来即可。
xyj
2021/08/13
1.5K0
VBA与数据库——写个类操作ADO_执行SQL
执行SQL:虽然读取和写入都有了,但是经常还是会碰上需要执行一些特殊的sql语句的情况,前面DB信息功能里的保存sql语句也是为了方便执行一些常用的sql语句。 执行cbInput的SQL: '执行指定sql语句 Sub rbbtnExcsql(control As IRibbonControl) Dim ret As Long If VBA.Len(DB_Info.Path) Then If VBA.Len(MPublic.scbInput) Then
xyj
2022/04/26
6540
VBA与数据库——写个类操作ADO_历史DB
但是如果是经常使用的数据库,还是希望能够一键就打开,这种时候就需要在菜单上显示出来。
xyj
2022/01/18
5821
VBA与数据库——写个操作数据库的加载宏_选择DB
选择DB:就是使用文件选择器来选择需要打开的数据库,显然这种方式是不能够完全满足数据库的连接的。
xyj
2022/01/18
5830
VBA与数据库——写个类操作ADO_DB信息
DB信息:就是手动记录历史DB用的按钮,开始是想打开一个新的数据库就自动记录,后来发现更多的都是临时操作一下,不值得记录,所以干脆做成一个按钮来记录。
xyj
2022/03/29
7930
VBA与数据库——ADO
ADO (ActiveX Data Objects,ActiveX数据对象)和字典Dictionary一样,就是Windows系统做好了的一个东西,是一种叫做COM对象的东西。
xyj
2021/04/26
2.1K0
VBA与数据库——ADO
相关推荐
VBA与数据库——写个类操作ADO_读取表名
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档