2013-07-19 8 views
5

Próbuję wysłać zapytanie do zdefiniowanej nazwy w zakresie arkusza roboczego za pomocą SQL przy użyciu ODBC.Jaka jest nazwa tabeli dla zdefiniowanej nazwy w zakresie arkusza roboczego?

już wiem, że to działa:

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 

Zauważ, że myname skoroszyt jest zawężona i nie arkuszu scoped.

Liczyłam, że coś we wzorach Excel pracuje dla nazwy tabeli ODBC, a także:

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

Jednak to nie działa, próbowałem kilka wersji składni tego.

Czy to możliwe, a jeśli tak, to jakiej składni należy użyć?

Uwaga dla programistów Delphi: Składnia A1:C10 powoduje kłopoty w TADOQuery, trzeba ustawić ParamCheck do False, aby to zadziałało.

Aktualizacja:

Używam Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) Wersja 12.00.6606.1000 że pochodzi z Microsoft Office 2007.

Sprawdziłem, że składniki bazy danych Delphi Używam zachowują się tak samo jak Microsoft Query i Microsoft Access 2007.

+0

Zakłada się, że '[worksheet1 $ myname]' nie działa? – eggyal

+1

Czy próbowałeś tego z Delphi tylko lub z jednego z innych produktów MS Office? Na przykład MS Access? –

+0

@eggyal To działa, ale tylko w wersji 14 (i nowszej) sterownika ODBC, jak się dowiedziałem metodą prób i błędów. –

Odpowiedz

1

Załóżmy, że masz plik programu Excel (xlsx w moim przypadku), który ma następujące nazwy (Excel formuła notacji):

  • myname
  • worksheet1!myname
  • worksheet2!myname

Różne wersje sterownika ODBC programu Excel mają inne zachowanie:

Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) Wersja 12, że pochodzi z Microsoft Office 2007 zachowuje się jak ten:

przestrzeni nazw są spłaszczone.

Wszystko, co można wyszukać, to SELECT * FROM myname. Podobno to zwraca dane z pierwszego zdefiniowanego imienia.

Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) Wersja 14 że pochodzi z Microsoft Office 2010 (and can be downloaded separatly from Microsoft) zachowuje się tak:

Można rzeczywiście zapytania wszystkie trzy z nich:

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

więc to było najwyraźniej ustalona Microsoft Office 2010.

Poprawka nie jest wstecznie kompatybilna. Po zdefiniowaniu nazwy zakresu zdefiniowanej w 2007 r. Można było wykonać kwerendę przy użyciu składni myname, która działa tylko w przypadku nazw indeksów w skoroszycie w 2010 r. Należy więc zachować ostrożność podczas radzenia sobie z tą sytuacją w różnych wersjach pakietu Office.

Uwaga: Jeśli link do pobrania kiedykolwiek wygaśnie, wyszukaj numer Microsoft Access Database Engine 2010 Redistributable.

1

Spróbuj wykonać następujące czynności, aby pomóc dowiedzieć się nazwy Delphi szuka.

  1. Upuścić pole kombi na formularzu.
  2. Uruchom następujący kod, aby wypełnić pole wyboru nazwami, które Delphi zaakceptuje: AdoConnection1.GetTableNames(ComboBox1.Items,True);
  3. Uruchom aplikację. Combobox powinien dać ci listę nazw możliwych do sprawdzenia.

Korzystanie z Delphi XE2 i Office 2010 (plik Excel zapisany jako format 97 w biurze) Stworzyłem zakres nazwany w arkuszu o nazwie zakres (lista1 numer!) I uruchomiłem kwerendę ADO w Delphi. Zapytanie to: SELECT * FROM [sheet1$numberlist]. Może to twój sterownik ODBC?

+0

Istnieją rzeczywiście różne sterowniki ODBC, sprawdzę to. Wywołanie GetTableNames to niezły pomysł. –

+0

Sterownik, którego używam, to "Sterownik Microsoft Excel (* .xls, * .xlsx, * .xlsm, * .xlsb)" Wersja '12.00.6606.1000' –

+0

Twoja składnia działa w Office 2010 i wyżej, zobacz moją odpowiedź. –