2013-07-19 5 views
5

Я пытаюсь запросить определенное имя в области рабочего листа с SQL с помощью ODBC.Каково имя таблицы для определенного имени в области рабочего листа?

Я уже знаю, что это работает:

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 это учебное пособие, а не область видимости WorkSheet область видимости.

я ожидал бы, что-то вроде в формулах Excel работает для имени таблицы ODBC, а также:

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

Однако это не работает, я попробовал некоторые варианты синтаксиса этого.

Возможно ли это, и если да, то какой синтаксис использовать?

Примечание для разработчиков Delphi: Синтаксис A1:C10 вызывает проблемы в TADOQuery, вы должны установить ParamCheck к False для того, чтобы это работало.

Update:

Я использую Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) версии 12.00.6606.1000, которая поставляется с Microsoft Office 2007.

Я проверил, что компоненты базы данных Delphi Я использую ведут себя так же, как Microsoft Query и Microsoft Access 2007.

+0

Предполагается, что '[workheet1 $ myname]' не работает? – eggyal

+1

Вы пробовали это только от Delphi, или от одного из других продуктов MS Office? Например, MS Access? –

+0

@eggyal Это работает, но только в версии 14 (и новее) драйвера ODBC, как я узнал из-за проб и ошибок. –

ответ

1

Предположим, у вас есть файл Excel (XLSX в моем случае), который имеет следующие имена (Excel формула обозначения):

  • myname
  • worksheet1!myname
  • worksheet2!myname

Различные версии драйвера Excel ODBC имеют другое поведение:

Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) Версия 12, который поставляется с Microsoft Office 2007 ведет себя, как это:

Пространства имен сплющены.

Все, что вы можете задать, это SELECT * FROM myname. По-видимому, это возвращает данные с первого имени, которое определено.

Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) Версия 14, который поставляется с Microsoft Office 2010 (and can be downloaded separatly from Microsoft) ведет себя так:

Вы действительно можете запросить все три из них:

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

Так это было, по-видимому зафиксирован в Microsoft Office 2010.

Исправление не соответствует обратной совместимости. Когда у вас было имя области видимости листа, определенная в 2007 году, вы можете запросить его с помощью синтаксиса myname, который работает только для имен с именами книг в 2010 году. Поэтому необходимо соблюдать осторожность при обработке этой ситуации в разных версиях Office.

Примечание: Если ссылка для скачивания когда-либо мертва, найдите Microsoft Access Database Engine 2010 Redistributable.

1

Попробуйте сделать следующее, чтобы помочь вам выяснить имя Delphi ищет.

  1. Капля комбинированного блока на форме.
  2. Заполните следующий код, чтобы заполнить выпадающее имя с именами, которые Delphi примет: AdoConnection1.GetTableNames(ComboBox1.Items,True);
  3. Запуск приложения. Компоновка должна предоставить вам список запрашиваемых имен.

Использование Delphi XE2 и Office 2010 (файл excel, сохраненный как формат офиса 97 xls). Я создал рабочий лист с диапазоном именованного диапазона (list1! Numberlist) и выполнил запрос ADO в Delphi. Запрос был SELECT * FROM [sheet1$numberlist]. Может, это ваш драйвер ODBC?

+0

Есть действительно разные драйверы ODBC, я проверю это. Вызов GetTableNames - хорошая идея. –

+0

Драйвер, который я использую, - это Microsoft Excel Driver (* .xls, * .xlsx, * .xlsm, * .xlsb) 'Version' 12.00.6606.1000' –

+0

Ваш синтаксис работает в Office 2010 и выше, см. Мой ответ. –

Смежные вопросы