6

我正在尝试使用 ODBC 使用 SQL 在工作表范围内查询定义的名称。

我已经知道这有效:

SELECT * FROM [worksheet1$]       -- Query a whole worksheet
SELECT * FROM [worksheet1$A1:C10] -- Query A1:C10 of a worksheet
SELECT * FROM myname              -- Query a workbook scoped defined name 

请注意,这myname是工作簿范围内的,而不是工作表范围内的。

我原以为 Excel 公式中的内容也适用于 ODBC 表名:

SELECT * FROM worksheet1!myname   -- Query a worksheet scoped defined name

但是这不起作用,我尝试了一些语法变体。

这是否可能,如果是,使用什么语法?

Delphi 开发人员注意:A1:C10语法会导致问题TADOQuery,您必须设置ParamCheckFalse才能使其工作。

更新:

Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)正在12.00.6606.1000使用Microsoft Office 2007.

我检查了我使用的 Delphi 数据库组件的行为方式与 Microsoft Query 和 Microsoft Access 2007 相同。

4

2 回答 2

1

请尝试以下方法来帮助您找出 Delphi 正在寻找的名称。

  1. 在表单上放置一个组合框。
  2. 运行以下代码以使用 Delphi 将接受的名称填充组合框:AdoConnection1.GetTableNames(ComboBox1.Items,True);
  3. 运行应用程序。组合框应该为您提供可查询名称的列表。

使用 Delphi XE2 和 Office 2010(保存为 office 97 xls 格式的 Excel 文件),我创建了一个名为 range (sheet1!numberlist) 的工作表,并在 Delphi 中运行了一个 ADO 查询。查询是SELECT * FROM [sheet1$numberlist]。也许是您的 ODBC 驱动程序?

于 2013-07-19T15:21:20.050 回答
1

假设您有一个具有以下名称(Excel 公式符号)的 Excel 文件(在我的情况下为 xlsx):

  • myname
  • worksheet1!myname
  • worksheet2!myname

不同版本的 Excel ODBC 驱动程序具有不同的行为:

附带的Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)版本是这样的:12Microsoft Office 2007

命名空间是扁平的。

您可以查询的只是SELECT * FROM myname. 显然,这会从定义的名字返回数据。

附带的Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)版本(并且可以从 Microsoft 单独下载)的行为如下:14Microsoft Office 2010

您确实可以查询所有三个:

SELECT * FROM myname
SELECT * FROM [worksheet1$myname]
SELECT * FROM [worksheet2$myname]

所以这显然是固定的Microsoft Office 2010

该修复程序不向后兼容。当您在 2007 年定义了工作表范围名称时,您可以使用myname仅适用于 2010 年工作簿范围名称的语法对其进行查询。因此,在跨不同版本的 Office 处理这种情况时需要小心。

注意:如果下载链接失效,请搜索Microsoft Access Database Engine 2010 Redistributable.

于 2013-07-22T10:52:29.400 回答