如何在ADODB SQL查询中连接到Excel命名范围

时间:2019-01-03 11:27:35

标签: excel vba ms-access adodb

我需要将数据从Excel工作表移至数据库。为此,我创建了ADODB Connection,并且能够执行这样的SQL查询: INSERT INTO myTable SELECT * FROM [Excel 12.0 Macro;HDR=Yes;Database=C:\MyPath\MyFile.xlsb].[Shee1$A1:C100]

我的问题是范围不能指向超过255列,即IU列。我想尝试改用命名范围,但是找不到合适的符号。我发现的所有示例都直接连接到工作簿,并使用SELECT * FROM [Sheet1$]引用或SELECT * FROM myRange作为命名范围的示例。我尝试过

[Excel 12.0 Macro;HDR=Yes;Database=C:\MyPath\MyFile.xlsb].[myRange]
[Excel 12.0 Macro;HDR=Yes;Database=C:\MyPath\MyFile.xlsb].[myRange$]
[Excel 12.0 Macro;HDR=Yes;Database=C:\MyPath\MyFile.xlsb].myRange
[Excel 12.0 Macro;HDR=Yes;Database=C:\MyPath\MyFile.xlsb;Name=myRange]

,但没有成功。

在这里使用命名范围的正确方法是什么?甚至可以解决列数限制吗?

我希望[Excel 12.0 Macro;HDR=Yes;Database=C:\MyPath\MyFile.xlsb].[myRange]可以工作,但是会引发以下错误:'Microsoft Access数据库引擎找不到对象'myRange'。确保对象存在(...)'

我可以通过将数据从源表复制到临时表来解决,并将其限制在255列以内,但这是很好的正确方法。

3 个答案:

答案 0 :(得分:1)

不确定是否要找到用于连接到命名范围的解决方案。我看了看如何使它工作,我也没有运气,我怀疑它没有包含在255列之后的架构中,但是可能是错误的。

我认为您可能还有一个高效的解决方案,该解决方案不依赖循环将数据添加到Access。它不仅是插入代码,还包含更多代码,但我希望它适合您的特定问题。

我能够在大约3秒钟内插入约2500条记录(所有整数),因此相当快。

StringBuilder aliasA = new StringBuilder("a");
StringBuilder dot = new StringBuilder(".");
Clausula clause1 = new Clausula(aliasA.append(dot).append("id").toString());
Clausula clause2 = new Clausula(aliasA.append(dot).append("name").toString());

答案 1 :(得分:1)

我遇到了同样的问题,解决方案非常简单,即使它仅适用于工作簿级别的命名范围。 必须连接到工作簿(即 [Excel 12.0 Macro;HDR=Yes;Database=C:\MyPath\MyFile.xlsb])。 然后在查询中输入:SELECT * FROM [myRange](请注意方括号和 $ 符号的缺失)

答案 2 :(得分:0)

您需要使用一种构造:

[Excel 12.0 Macro;HDR=Yes;Database=C:\MyPath\MyFile.xlsb].[$myRange]