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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Transformers 4.37 中文文档(十九)
Trainer 类提供了一个用于在 PyTorch 中进行完整特征训练的 API,并支持在多个 GPU/TPU 上进行分布式训练,支持NVIDIA GPUs的混合精度,AMD GPUs,以及 PyTorch 的torch.amp。Trainer 与 TrainingArguments 类相辅相成,后者提供了广泛的选项来自定义模型的训练方式。这两个类一起提供了一个完整的训练 API。
ApacheCN_飞龙
2024/06/26
1.5K0
Transformers 4.37 中文文档(十一)
在本指南中,我们将看到如何创建自定义管道并在Hub上共享它或将其添加到🤗 Transformers 库中。
ApacheCN_飞龙
2024/06/26
3810
Transformers 4.37 中文文档(二)
除了🤗 Transformers 的 notebooks 之外,还有示例脚本演示如何使用PyTorch、TensorFlow或JAX/Flax训练模型的方法。
ApacheCN_飞龙
2024/06/26
6920
Transformers 4.37 中文文档(二)
Transformers 4.37 中文文档(一)
下表表示库中对这些模型的当前支持,它们是否有 Python 分词器(称为“slow”)。由🤗 Tokenizers 库支持的“fast”分词器,它们是否在 Jax(通过 Flax)、PyTorch 和/或 TensorFlow 中有支持。
ApacheCN_飞龙
2024/06/26
1.2K0
Transformers 4.37 中文文档(一)
深度探索 DeepSeek 微调:LoRA 与全参数微调实战指南
DeepSeek 作为强大的大模型,提供了优质的基础能力,但在某些特定任务上,直接使用预训练模型可能无法满足需求。本篇文章将介绍 LoRA(Low-Rank Adaptation)、全参数微调 等微调策略,并提供详细的代码示例,帮助开发者高效定制 DeepSeek 以适应特定任务。
Swift社区
2025/02/07
6K0
深度探索 DeepSeek 微调:LoRA 与全参数微调实战指南
深度探索 DeepSeek 微调:LoRA 与全参数微调实战指南
DeepSeek 作为强大的大模型,提供了优质的基础能力,但在某些特定任务上,直接使用预训练模型可能无法满足需求。本篇文章将介绍 LoRA(Low-Rank Adaptation)、全参数微调 等微调策略,并提供详细的代码示例,帮助开发者高效定制 DeepSeek 以适应特定任务。
网罗开发
2025/02/18
7780
深度探索 DeepSeek 微调:LoRA 与全参数微调实战指南
Transformers 4.37 中文文档(五)
目标检测是计算机视觉任务,用于检测图像中的实例(如人类、建筑物或汽车)。目标检测模型接收图像作为输入,并输出检测到的对象的边界框的坐标和相关标签。一幅图像可以包含多个对象,每个对象都有自己的边界框和标签(例如,它可以有一辆汽车和一座建筑物),每个对象可以出现在图像的不同部分(例如,图像可以有几辆汽车)。这个任务通常用于自动驾驶,用于检测行人、道路标志和交通灯等。其他应用包括在图像中计数对象、图像搜索等。
ApacheCN_飞龙
2024/06/26
4600
Transformers 4.37 中文文档(五)
Transformers 4.37 中文文档(三)
www.youtube-nocookie.com/embed/ajPx5LwJD-I
ApacheCN_飞龙
2024/06/26
2500
Transformers 4.37 中文文档(十四)
您可以使用AutoBackbone类初始化一个模型作为骨干,并获取任何阶段的特征图。您可以定义out_indices来指示您想要从哪些层获取特征图。如果您知道层的名称,也可以使用out_features。您可以互换使用它们。如果同时使用out_indices和out_features,请确保它们是一致的。不传递任何特征图参数将使骨干产生最后一层的特征图。为了可视化各个阶段的外观,让我们以 Swin 模型为例。每个阶段负责特征提取,输出特征图。
ApacheCN_飞龙
2024/06/26
7570
Transformers 4.37 中文文档(十)
在多个 GPU 上进行训练可能是一个棘手的任务,无论是遇到安装问题还是 GPU 之间的通信问题。这个调试指南涵盖了一些可能遇到的问题以及如何解决它们。
ApacheCN_飞龙
2024/06/26
5140
Transformers 4.37 中文文档(十)
Transformers 4.37 中文文档(四)
www.youtube-nocookie.com/embed/KWwzcmG98Ds
ApacheCN_飞龙
2024/06/26
4100
Transformers 4.37 中文文档(四)
Transformers 4.37 中文文档(七)
🤗 Transformers 中有几个多语言模型,它们的推理用法与单语模型不同。不过,并非所有多语言模型的用法都不同。一些模型,如bert-base-multilingual-uncased,可以像单语模型一样使用。本指南将向您展示如何使用推理中用法不同的多语言模型。
ApacheCN_飞龙
2024/06/26
7110
Transformers 4.37 中文文档(五十七)
RoCBert 模型是由 HuiSu、WeiweiShi、XiaoyuShen、XiaoZhou、TuoJi、JiaruiFang、JieZhou 在 RoCBert: Robust Chinese Bert with Multimodal Contrastive Pretraining 中提出的。它是一个经过预训练的中文语言模型,在各种形式的对抗攻击下具有鲁棒性。
ApacheCN_飞龙
2024/06/26
2660
Transformers 4.37 中文文档(十五)
无论您选择哪个框架,您都可以使用 GenerationConfig 类实例对生成方法进行参数化。请参考此类以获取完整的生成参数列表,这些参数控制生成方法的行为。
ApacheCN_飞龙
2024/06/26
1K0
Transformers 4.37 中文文档(十五)
Transformers 4.37 中文文档(七十)
MobileViTV2 模型是由 Sachin Mehta 和 Mohammad Rastegari 在移动视觉 transformers 的可分离自我关注中提出的。
ApacheCN_飞龙
2024/06/26
1920
Transformers 4.37 中文文档(七十)
Transformers 4.37 中文文档(二十三)
BertGeneration 模型是一个可以利用 EncoderDecoderModel 进行序列到序列任务的 BERT 模型,如 Sascha Rothe, Shashi Narayan, Aliaksei Severyn 在 利用预训练检查点进行序列生成任务 中提出的那样。
ApacheCN_飞龙
2024/06/26
2460
Transformers 4.37 中文文档(十二)
🤗 Transformers 是一个预训练的最先进模型库,用于自然语言处理(NLP)、计算机视觉以及音频和语音处理任务。这个库不仅包含了 Transformer 模型,还有像现代卷积网络这样的非 Transformer 模型,用于计算机视觉任务。如果你看一下今天最流行的消费产品,比如智能手机、应用和电视,很可能背后都有某种深度学习技术。想要从智能手机拍摄的照片中移除背景物体?这就是一个全景分割任务的例子(如果你还不知道这是什么,不用担心,我们将在接下来的部分中描述!)。
ApacheCN_飞龙
2024/06/26
5890
Transformers 4.37 中文文档(十二)
【AI大模型】Transformers大模型库(七):单机多卡推理之device_map
这里的Transformers指的是huggingface开发的大模型库,为huggingface上数以万计的预训练大模型提供预测、训练等服务。
LDG_AGI
2024/08/13
2.5K0
Transformers 4.37 中文文档(十七)
管道是使用模型进行推断的一种很好且简单的方式。这些管道是抽象出库中大部分复杂代码的对象,提供了专门用于多个任务的简单 API,包括命名实体识别、掩码语言建模、情感分析、特征提取和问答。查看任务摘要以获取使用示例。
ApacheCN_飞龙
2024/06/26
5960
【LLM训练系列04】手把手教你Qlora微调
IGNORE_TOKEN_ID 是一个常量,通常用于在训练过程中忽略某些特定的标签或输入。它的作用是告诉模型在计算损失时不考虑这些特定的标签或输入。
致Great
2024/12/21
2040
【LLM训练系列04】手把手教你Qlora微调
推荐阅读
相关推荐
Transformers 4.37 中文文档(十九)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验