如何修改OLEDB连接SQL语句以支持超65536行数据(Excel更新Access)
解决Excel到Access插入时的行限制问题
你遇到的65536行限制是因为旧的Jet OLEDB引擎默认识别Excel 97-2003格式的行上限,改用ACE.OLEDB驱动就能支持Excel 2007+的1048576行上限。下面是具体的调整方法:
正确的ACE.OLEDB连接与查询写法
首先要把ACE驱动明确指定为数据提供者,而不是像之前那样把驱动名混在表引用里。正确的SQL查询逻辑应该拆分成「连接字符串配置驱动」+「正常表范围引用」两部分:
1. 连接字符串(以VBA为例)
先在连接阶段指定ACE驱动和Excel文件信息:
Dim conn As Object Set conn = CreateObject("ADODB.Connection") ' 针对xlsb启用宏的格式,Extended Properties要加Macro参数 conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=K:\FolderName\FileName.xlsb;" & _ "Extended Properties=""Excel 12.0 Macro;HDR=YES;"";"
2. 简化的查询语句
连接完成后,直接正常引用工作表范围即可,不需要再在FROM里写驱动信息:
SELECT * FROM [SheetName$A1:W1048576] -- Excel 2007+最大行是1048576 WHERE Data = #01/01/2018#;
如果想直接引用工作表的所有有效数据,甚至可以省略范围,直接写[SheetName$],ACE驱动会自动识别实际使用的行,不会被65536行限制。
关键调整点
- 抛弃旧的混合写法:不要再把
Microsoft.ACE.OLEDB.12.0写在FROM子句的表名里,那是Jet引擎的遗留用法,ACE驱动只需要在连接字符串中配置。 - 匹配驱动位数:如果你的Office是64位,必须安装64位的ACE驱动;32位Office对应32位驱动,否则会出现连接失败或权限报错。
- xlsb格式注意事项:因为你的文件是
.xlsb(二进制宏工作簿),Extended Properties里要加上Macro参数,否则驱动可能无法正确识别文件格式。
完整插入Access的VBA示例
如果是直接通过SQL把Excel数据插入Access表,可以用IN子句整合Excel连接信息:
Sub InsertExcelToAccess() Dim connAccess As Object Dim strSQL As String ' 连接目标Access数据库 Set connAccess = CreateObject("ADODB.Connection") connAccess.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=C:\YourTargetDB.accdb;" ' 构造跨数据库插入的SQL strSQL = "INSERT INTO YourAccessTableName " & _ "SELECT * FROM [SheetName$A1:W1048576] " & _ "IN ""K:\FolderName\FileName.xlsb"" ""Excel 12.0 Macro;HDR=YES;"" " & _ "WHERE Data = #01/01/2018#;" ' 执行插入 connAccess.Execute strSQL ' 清理资源 connAccess.Close Set connAccess = Nothing MsgBox "数据插入完成!" End Sub
内容的提问来源于stack exchange,提问作者Rascio
相关产品推荐
相关产品推荐

