EXCEL VBA与SQL server的交互(二)

2023-11-04

引言

书接上回,接着讲VBA与SQL server的交互

本篇主要内容包括VBA执行存储过程,以及VBA与SQL server交互的一些技术细节

偏技术的会放在文章的最后,不感兴趣的可以直接跳过

正文

我们上回用VBA从SQL server中获取了一些数据,现在让我们来使用VBA传递数据给SQL server

代码和上回几乎一样,我们就来简单的复习一下

首先要创建连接以及数据集:

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

然后呢打开连接,执行insert语句:

conn.ConnectionString = "Provider=SQLOLEDB;Server=127.0.0.1;Database=Test;Uid=sa;Pwd=123456789"
conn.Open

Dim sql_text As String
sql_text = "insert into  [Test].[dbo].[test] values('fakecountry',111,111,222)"

rs.Open sql_text, conn

最后关闭连接释放资源:

Set rs = Nothing
conn.Close
Set conn = Nothing

就这么简单,我们就传递了一行数据到数据库test表中

但在实际的生产环境中,情况要复杂很多

首先,实际工作中我们可能没有这么大的数据库权限,会允许我们随意增改删查数据库中的表

一般可能开放视图或者某些存储过程的权限

所以呢接下来让我们看看怎么通过VBA执行存储过程,来达到数据抽取和数据批量存入的目的

先来看怎么用存储过程来从数据库获取数据

我的test库中有这样一个存储过程:

非常简单的一个存储过程,功能是通过入参(国家名)来获取整行数据

我们只需要在上次的代码基础上做略微的修改即可:

Sub test()

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset

conn.ConnectionString = "Provider=SQLOLEDB;Server=127.0.0.1;Database=Test;Uid=sa;Pwd=123456789"
conn.Open
conn.[population] "China", rs

Dim counter As Integer
counter = 0

Dim col_name() As String
Dim col_count As Integer

With rs
 
    col_count = .Fields.Count
    ReDim Preserve col_name(0 To col_count - 1)
    
    For counter = 0 To col_count - 1
    
        col_name(counter) = .Fields(counter).Name
        
    Next counter
    
    With ThisWorkbook.Worksheets("Sheet1")
    
        .Range("A1").Resize(1, col_count) = col_name
        .Range("A2").CopyFromRecordset rs
    
    End With

End With

Set rs = Nothing
conn.Close
Set conn = Nothing

End Sub

和上一篇的代码对比少了:

Dim sql_text As String
sql_text = "SELECT top 100 * FROM [Test].[dbo].[test]"
rs.Open sql_text, conn

这三行,多了:

conn.[population] "China", rs

这一行,结果如图所示:

从存储过程获取数据非常的简单,接下来看怎么插入数据

假设我们有这样一个存储过程:

代码和直接用insert比较类似,就不一一讲解了,直接上代码:

Sub test4()

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

conn.ConnectionString = "Provider=SQLOLEDB;Server=127.0.0.1;Database=Test;Uid=sa;Pwd=123456789"
conn.Open
conn.[population_in] "fakecountry", 111, 111, 222

conn.Close
Set conn = Nothing

End Sub

就是这么的简单,不过上面的语句很很大的优化空间,这个先按下不表,等到第三篇再细说

通过第一篇以及上面的内容我们已经能写语句在VBA里面完成对数据表格数据的增和查,改和删同理大家可以自行研究

接下来要讲的偏技术,主要讲解VBA与SQL server交互的原理,也是为第三篇,代码的优化做铺垫;如果是实用主义的同学看到这里就可以关网页了

回忆一下第一篇文章,我们在写代码前引用了两个库,也就是:

Microsoft ActiveX Data Objects 6.1 Library

Microsoft ActiveX Data Objects Recordset 6.0 Library

这里的ActiveX Data Objects,简称ADO,是微软推出的通用数据访问技术

我们使用VBA与外部数据源做交互的时候都会使用到ADO,比如和SQL server的交互、和计算机本地文本文件的交互、和Oracle的交互、和Mysql的交互、以及和Access的交互等

ADO本身并不直接与外部数据交互,它只是一套规范;与外部数据直接接触的是一个名为OLE DB的技术,ADO是OLE DE与VBA之间的桥梁

而ADO的优势就是,不管访问的是什么外部数据源,ADO的使用者只需要一组相同的命令。

打个比方,SQL server中我们可以使用select * into <table1> from <table2>的写法来插入数据,但mysql中没有这个语法。也就是说同样的插入数据,对于这两个数据库,可能需要写两个不同的语句。有了ADO就不同的,只要按照ADO的规则,那么对于SQL server和MySQL来说插入的语句的写法是一样的。作为VBA使用者,我们就不需要考虑数据源的个性问题了。

看到这里有些同学可能就会发问了,上面写的插入和查询语句都是写死的,也就是:

sql_text = "insert into  [Test].[dbo].[test] values('fakecountry',111,111,222)"

这完全没有用到ADO的优势呀,不要急,这个我们到第三章再做优化

VBA,ADO,OLE DB,以及数据源的关系是这样的:

ADO中常用的对象有三个(总共有多少个楼主不清楚),还有四个集合:

在前文中我们用到了,connection和recordset object

connection object顾名思义是用来创建连接的,但有时connection对象也不是必要的

在recordset对象中就有一个可以替代connection object对象的activeconnection属性

connection object常用的属性包括:

1.connectionstring,这个我们上面已经用到过了:

conn.ConnectionString = "Provider=SQLOLEDB;Server=127.0.0.1;Database=Test;Uid=sa;Pwd=123456789"

这个连接字符串中有5个参数,其中Provider这个,它告诉ADO使用哪个OLE DB

后面的参数都是给具体的某个OLE DB的参数

Provider其实不是必填的参数,如果省略,ADO就默认使用ODBC

2.ConnectionTimeout,这个参数就不解释了,懂的都懂

3.State,这个属性用来查询当前的连接状态,值包括:

  • adStateClosed,连接已关闭
  • adStateOpen,连接已打开
  • adStateconnecting,正在创建连接
  • adStateExecuting,正在执行命令

然后是connection object的方法,包括:

1.open,这个方法我们在上面也用过了,用于打开连接

不过多介绍这个方法了,但有一点比较有趣的是,open这个方法支持异步连接

如果你的程序需要长时间的连接,那么这个异步就很有用了,具体的就不展开了

2.Execute,这个方法我们在上面其实也用到过:

conn.[population_in] "fakecountry", 111, 111, 222

上面的语句虽然没有直接写出Execute,但实际是一样的

一般Execute用来执行那些没有返回结果的语句,也就是增改删语句

当然也可以用来和Recordset配合来执行查询语句:

set recordset = conn.Execute("select * from table")

3.Close,这个方法也不用说了,只要记住关闭连接不代表释放资源

connection这个对象有两个集合,Error和Properties

这里就不作介绍了,大家只要知道,Error包含一组Error(也包括警告和消息)对象,这些信息和ADO本身没有关系,是各个OLE DB提供的

Properties包含了一些OLE DB提供的扩展信息

Recordset这个对象我们在上面也使用过了,首先来看一下常用的属性:

1.ActiveConnection

这个属性有两种使用方法,一种是配合Connection对象,另一种是抛弃Connection对象自己创建连接:

set rs.ActiveConnection = conn
或者
set rs.ActiveConnection = "Provider=SQLOLEDB;Server=127.0.0.1;Database=Test;Uid=sa;Pwd=123456789"

2.BOF,也就是beginning of file,数据集的第一条记录

3.EOF,也就是end of file,数据集的最后一条

4.Filter,也就是筛选器:

rs.Filter = "country like 'Ch*'"

筛选器支持使用通配符,这让筛选器变得很好用

5.State,这个属性和Connection对象的State属性一样

结尾

本篇就先讲到这里了,本来想讲完三个对象的,但内容有点多,还是在下篇来讲吧

下一篇我们会把Recordset这个对象的方法和集合讲完,然后讲Command对象

如果顺利的化=话还会做一些代码优化的讲解,如果顺利的话。。。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EXCEL VBA与SQL server的交互(二) 的相关文章

  • 我可以通过 vba 设置 Excel Power Query 的用户名和密码吗?

    我正在尝试设置一个电子表格 供其他人使用 通过 Power Query 更新表 当另一个用户使用电子表格时 他们会被要求 3 次输入用户名和密码 因为我有 3 个表正在更新 如何通过 VBA 为每个用户设置这些 我尝试将连接设置为匿名 但他
  • Excel工作表中的动态减法公式

    我需要在Excel中编写一个动态减法公式 该公式从其上方的单元格中减去 指定列的 单元格 例如 A2 A1 G1 G列固定 and A3 A2 G2 and A4 A3 G3 等等 Excel 足够智能 可以使用动态引用和对当前单元格的相对
  • 运行时错误“13”:IF 与 OR 语句组合的类型不匹配

    在我使用 Excel 的 VBA 代码中 Dim Field2 As String Field2 Cells i 4 Value If Right Field2 3 A 1 Or A 2 Or B 1 Or B 2 Or C 1 Or C
  • 当第二个工作表中存在值时删除整行

    我有 2 张纸 sheet1 和sheet2 我在单元格 A3 sheet1 中有一个值 该值不是恒定的 Sheets2 中还有许多文件 我想做的是 当单元格 A3 Sheet1 中的值与 A 列 Sheet2 中的值相同时 它将删除找到该
  • Python(openpyxl):将数据从一个excel文件转移到另一个(模板文件)并用另一个名称保存,同时保留模板

    我有一个templateexcel 文件名为template xlsx其中有许多张 我想从单独的地方复制数据 csv文件到第一页template xlsx 命名为data 并将新文件另存为result xlsx同时保留原来的模板文件 我想粘
  • VBA 代码基准测试

    对 VBA 代码进行基准测试最准确的方法是什么 在我的例子中 我正在 Excel 中测试代码 除了下面的 2 种之外 还有其他对代码进行基准测试的技术吗 如果有 该方法的优点 缺点是什么 这里有两种流行的方法 First Timer Sub
  • 如何使用VBA删除工作簿中的空白工作表?

    Sub delete Dim sh As Worksheet wb As String c As Range wb InputBox work book name Set sh Workbooks wb Sheets For Each Sh
  • Excel VBA 通过简单除法引发溢出错误

    Excel 2013 VBA 这段代码 Sub test On Error GoTo Err Dim p As Double p 362 100 2005 Exit Sub Err If Err Description lt gt And
  • 如何使用Python更改Excel中的列格式

    我想使用 openpyxl 方法将一张纸上的特定行和列复制到另一张纸上 但我的主要 Excel 文件是 xlsb 文件 而 openpyxl 不支持 xlsb 文件 所以我构建了这种复杂的方式 根据公司规则 我无法从 Microsoft E
  • 用户完成后关闭 Excel

    任务非常简单 我想从 VB net GUI 打开 Excel 文档 xls 用户将处理 Excel 文件 用户完成后关闭 Excel 文件 我想要VB net代码释放Excel对象 问题是 当用户关闭文件时 Excel 对象仍然可以在任务管
  • VBScript for Excel:如何选择源数据 (.SetSourceData)?

    我已经在谷歌和这里搜索了这个问题的答案 但没有成功 如果之前有人问过 那么我道歉 我正在尝试使用 VBScript 自动执行一些管理任务 此特定脚本的目的是从文本文件 包含文本和数字列 中获取一些使用情况统计信息 并根据数据制作折线图 创建
  • 如何在 VB.NET 中将 DataGridView 导出为 Excel 格式

    我使用 OLE 通过 VB NET 连接到数据库 并在 DataGridView 中显示结果 我想将 DataGridView 中的数据导出到 Excel 格式文件 即用户可以将 DataGridView 的内容保存为 MS Excel 文
  • 遍历 Excel 工作表

    这是我的代码 我是 VBA 新手 所以我不确定如何迭代多个页面 这是我的代码 Dim ws As Worksheet Sub spellCheck For Each ws In ActiveWorkbook Worksheets Cells
  • Excel VBA 检查工作簿是否打开,如果没有打开则打开

    我在下面放置的代码无法正常工作 尝试运行宏时出现错误 400 您能稍微回顾一下这段代码吗 我不确定问题是否不在于我所指的函数变量 Sub AutoFinal Dim final wb As Workbook shop stat wb As
  • C# - 如何迭代 Excel._Worksheet 中的所有行?

    我希望以编程方式从 Excel 工作表中提取数据并将其插入数据库表中 如何确定工作表中的列数和行数或以其他方式迭代行 I have Excel Worksheet worksheet Excel Worksheet workbook Act
  • UnicodeDecodeError:“utf-8”编解码器无法解码位置 14 中的字节 0xb9:起始字节无效

    我正在使用 Django REST 进行文件上传测试 Python3 6 2Django1 11djangorest框架 3 6 4Excel OSX 15 38 170902 操作系统 10 12 6 过去使用普通照片文件可以成功完成此操
  • Excel 中分组经常性 CF 的净现值

    下面是 60 个期间的现金流量表 有一组经常性现金流量 Excel 中是否有一种简单的方法可以计算所有 60 个期间 每月现金流量 的 NPV 而无需创建 60 行的表格并使用 NPV 公式 因此 60 个订单项的公式如下所示 NPV PE
  • VBA 用户表单:防止组合框在 KEYDOWN 时转义

    社区 有一种方法可以防止活动组合框在列表末尾 或开头 按下向下箭头 或向上箭头 时失去焦点 如果有更好的方法来做到这一点 最好使用 MS 标准属性 请分享 问题 当位于组合框中列表的末尾时 如果您点击向下箭头 它会将您移至活动组合框下方的任
  • Excel VBA 循环遍历 10,000 组行,每组包含 20 行

    如何将当前按行循环的 Excel VBA 代码转换为循环 20 行集 据我了解 Step函数可能与以下行一起使用 Range V1 Value Application Index vInput1 r 0 但是 我不确定如何修改代码以循环遍历
  • 以编程方式创建验证列表

    我有一组从外部源进入 VBA 代码的数据 我希望能够分配该数据以用作此工作簿中一张工作表的单元格下拉框中的验证 但是 我不想将该数据复制到工作表中 然后使用命名范围 可能有相当多的数据 而且这感觉不是很有效 我确信一定有办法 但我还没有找到

随机推荐

  • mysql 数字to char_mysql数字tochar

    例如 指定一个字段的类型为 INT 6 就可以保证所包含数字少于 6 个的值从 二 字符串类型 MySQL 提供了 8 个基本的字符串类型 分别 CHAR VARCHAR 查看当前安装的 MySQL 所支持的字符集 show charset
  • 数字电路设计之Xilinx全局时钟网络的使用

    为了实现同步电路设计 Xilinx使用了一种时钟分配树 其实感觉就是多个H组成的时钟网络 这样就可以使得每个时钟的延时都一样 为了使用Xilinx的全局时钟 可以使用全局时钟原语 IBUFGP U1 I clk in O clk out 全
  • [394]chrome浏览器的options参数

    1 背景 在使用selenium浏览器渲染技术 爬取网站信息时 默认情况下就是一个普通的纯净的chrome浏览器 而我们平时在使用浏览器时 经常就添加一些插件 扩展 代理之类的应用 相对应的 当我们用chrome浏览器爬取网站时 可能需要对
  • 野火13:GPIO输入——按键检测

    include stm32f10x h include bsp led h include bsp key h int main void LED端口初始化 跟上一节的LED一模一样 直接拿过来用 LED GPIO Config LED1
  • Check failed: registry.count(type) == 1 (0 vs. 1) Unknown layer type: Python

    在使用caffe的python层时经常容易出现如下错误 Check failed registry count type 1 0 vs 1 Unknown layer type Python 其原因是没有开启对python的支持 需要在Ma
  • rke部署k8s集群(包含清理)

    1 下载rke工具 https github com rancher rke releases 选择对应版本然后重命名为rke 2 禁用虚拟内存 vm swappiness 0 3 ssh配置文件打开配置 AllowTcpForwardin
  • C# 使用NAudio实现声音的录制(麦克风 , 扬声器)

    NAudio 简介 NAudio是个相对成熟 开源的C 音频开发工具 它包含录音 播放录音 格式转换 混音调整等功能 本次介绍主要功能有音频 录音文件播放 实时音频流波形图显示等 第一步 添加引用 在NuGet中搜索NAudio 并安装 第
  • SLAM笔记(九)再谈李代数

    内容接SLAM笔记 一 SLAM中的数学概览 李群 定义 实数空间上的连续群 对乘法 逆都是连续的 解析的 举例 如GL n SO n SE n 李代数 Lie algebra 定义 由一个集合 一个数域 和一个二元运算 组成 满足封闭 双
  • 基于ILRuntime和Addressable搭建热更框架记录——ILRuntime踩坑记录

    前言 原本就想基于新资源管理系统来做热更 现在开始做这个事情 以下会记录一些重要步骤及所踩的坑 Unity版本 2020 1 ILRuntime版本 1 6 6 接上文 基于ILRuntime和Addressable搭建热更框架记录 接入I
  • idea纯java工程使用gradle指定生成jar的Main-Class,idea生成jar

    build gradle核心代码如下 jar manifest attributes Main Class com example sample Application from configurations compile collect
  • 【Electron Playground 系列】文件下载篇

    作者 long woo 文件下载是我们开发中比较常见的业务需求 比如 导出 excel web 应用文件下载存在一些局限性 通常是让后端将响应的头信息改成 Content Disposition attachment filename xx
  • 以编译ipk包方式修改openwrt web界面。

    一 在 home wfly mt7620 op openwrt package 下 建立 test files目录 二 1 进入 test files目录建立test lua文件 如下 module luci controller admi
  • [datawhale202302]CS224W图机器学习:图机器学习导论

    结论速递 本次task是图机器学习的导论 围绕了几个问题展开 图机器学习的动机 图数据是有关联的数据 在现实生活中的例子 图机器学习与传统机器学习的区别 难点有哪些 图机器学习的基本概念 图神经网络的基本形式 图嵌入 图机器学习可以解决的任
  • 数据结构题目-二叉树的遍历

    目录 问题 BK 二叉树非递归前序遍历 附加代码模式 问题 BL 二叉树非递归中序遍历 附加代码模式 题 BM 二叉树非递归后序遍历 附加代码模式 问题 BN 求二叉树中序遍历序根节点的下标 问题 BO 根据前序 中序还原二叉树 问题 BP
  • Eclipse中各种查找快捷键

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 ctrl h打开搜索界面 File Search containing text填 File name patterns填写hello 可以找到hello为命名的文件
  • pls_integer类型

    今天在看一个触发器代码的时候碰到了一个pls integer类型 以前没碰到过 记录一下 PLS INTEGER可以存储一个有符号的整形值 其精度范围和BINARY INTEGER一样 是 2 31 2 31 PLS INTEGER和NUM
  • SSEGCN

    目录 SSEGCN 论文内容 1 研究背景 2 相关方法 3 研究方法 Input and Encoding Layer Attention Layer Aspect aware Attention Self Attention Synta
  • 游戏服务器引擎的设计(二)开发游戏服务器底层 及libuv使用

    服务器底层 个人任务认为稳定 高效 易用最重要 如果非要排个序的话 稳定 gt 易用 gt 高效 我是用的libuv这个库作为基础支持库的 为啥用它 主要是网络库不想自己写了 有现成的最好 这个库是轻量级的库而且跨平台 windows下分装
  • python之批量转换采样率

    需求 将本地音频16K采样率批量转换为8K采样率 批量转换采样率 import os import librosa import soundfile 定义转换采样率的函数 接收3个变量 原音频路径 重新采样后的音频存储路径 目标采样率 de
  • EXCEL VBA与SQL server的交互(二)

    引言 书接上回 接着讲VBA与SQL server的交互 本篇主要内容包括VBA执行存储过程 以及VBA与SQL server交互的一些技术细节 偏技术的会放在文章的最后 不感兴趣的可以直接跳过 正文 我们上回用VBA从SQL server