本文档主要介绍了如何在VBA编程环境中利用ADO(ActiveX Data Objects)技术,在SQL Server环境下进行二进制文件的远程导入和导出操作。ADO提供了一种高效且灵活的方式来处理数据库操作,特别是在处理大文件时,它支持分块读写,以优化性能。 首先,作者引入了ADO的两个关键组件:`ADOAppendChunkGetChunk` 和 `ADOStream`。`ADOAppendChunkGetChunk` 可能是一个自定义函数或方法,用于处理大文件的分块读取,而 `ADOStream` 是一个流对象,可以用来读取和写入数据流,非常适合处理二进制文件。 在`ImportBinData` 公共子程序中,作者展示了具体的操作步骤: 1. 声明变量:定义了连接(`cn`)、记录集(`rs`)、字段(`Col`)等,以及字符串变量 `cnStr`, `sql`, `strData`,整型变量 `BlockNums`, `FileLength`, `LeftOver`, `SourceFileNum`, `BlockSize`,其中 `BlockSize` 用于设置每个读取块的大小(例如4KB)。 2. 定义路径和文件名,这里使用了变量 `Path` 和 `fileNm`,并将它们组合成完整的文件路径。 3. 创建并初始化数据库连接,指定驱动器、服务器、数据库名称、用户名和密码。 4. 设置SQL查询语句,用于从`tmp`数据库的`tmp`表中获取`FileData`字段的数据,这表明目标表结构包含一个用于存储二进制文件的字段。 5. 打开一个记录集,使用指定的SQL查询,并设置打开方式为键集模式(`adOpenKeyset`),锁定选项为乐观锁(`adLockOptimistic`),命令类型为表(`adCmdTable`)。 6. 遍历记录集,获取`FileData`字段中的二进制数据,将其拆分为块存储到`strData`数组中,同时计算文件的总长度和剩余未读取的数据量。 这个过程是典型的文件导入场景,适合于大文件的处理,因为它避免一次性加载整个文件到内存,而是按需读取和处理数据。如果需要导出数据,可以类似地操作,只是方向相反,即把`strData`数组中的数据写入数据库的`FileData`字段。 本文档的核心知识点是利用VBA中的ADO库在SQL Server中实现二进制文件的远程导入和导出,强调了分块处理和效率优化的重要性。通过这种方式,可以在处理大型或复杂数据文件时提高程序的性能和稳定性。
''方法一:使用ADO AppendChunk、GetChunk方法
''方法二(推荐):使用ADO Stream对象
''环境:win7、sqlserver2008、access2010
''日期:2018-10-05
--sqlserver表
CREATE TABLE [tmp].[Fi](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Dt] [date] NOT NULL,
[FileNm] [nvarchar](100) NULL,
[FileTp] [nvarchar](100) NULL,
[FileData] [varbinary](max) NULL,
CONSTRAINT [Pk_Fi] PRIMARY KEY CLUSTERED
( [Id] ASC )
)
''====================================== 方法一 ======================================
Public Sub ImportBinData()
''ADO远程导入二进制文件,使用AppendChunk方法
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim Col As ADODB.Field
Dim cnStr As String
Dim sql As String
Dim strData() As Byte ''声明一个动态数组
Dim BlockNums As Long ''读写块数
Dim LeftOver As Long ''剩余字节数
Dim SourceFileNum As Long ''文件句柄
Dim i As Long
Const BlockSize As Long = 4096 ''定义常量 块大小
SourceFileNum = FreeFile ''获得剩余的文件句柄号
Path = "d:\"
fileNm = "a.zip"
DiskFile = Path + fileNm
Set cn = New ADODB.Connection
cnStr = "Driver={sql server};server=asus;database=tmp;uid=sa;pwd=sa;"
cn.Open cnStr
Set rs = New ADODB.Recordset
sql = "tmp.tmp.fi"
rs.Open sql, cn, adOpenKeyset, adLockOptimistic, adCmdTable
Set Col = rs.Fields("FileData")
Open DiskFile For Binary Access Read As SourceFileNum ''读取二进制数据
FileLength = LOF(SourceFileNum) ''获得文件长度
MsgBox FileLength
If FileLength = 0 Then
Close SourceFileNum ''关闭文件
Else
BlockNums = FileLength \ BlockSize ''获得块数
LeftOver = FileLength Mod BlockSize ''最后一块的字节数
剩余7页未读,继续阅读
- 粉丝: 1
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展