2013-07-19 17 views
5

Sto provando a interrogare un nome definito in un ambito del foglio di lavoro con SQL utilizzando ODBC.Qual è il nome della tabella per un nome definito nell'ambito di un foglio di lavoro?

so già che questo funziona:

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 

noti che myname è cartella di lavoro ambito e non foglio di lavoro ambito.

mi sarei aspettato che qualcosa di simile nelle formule di Excel lavora per il nome della tabella ODBC così:

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

Tuttavia, questo non funziona, ho provato alcune variazioni di sintassi di questo.

È possibile e se lo è, qual è la sintassi da utilizzare?

Nota per gli sviluppatori Delphi: la sintassi A1:C10 provoca problemi TADOQuery, è necessario impostare ParamCheck-False in modo che questo funzioni.

Aggiornamento:

Sto utilizzando la versione Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)12.00.6606.1000 che viene fornito con Microsoft Office 2007.

Ho verificato che i componenti di database di Delphi che sto usando si comportano allo stesso modo di Microsoft Query e Microsoft Access 2007.

+0

Si presume che '[foglio di lavoro1 $ myname]' non funzioni? – eggyal

+1

Hai provato questo solo da Delphi o anche da uno degli altri prodotti MS Office? Ad esempio, MS Access? –

+0

@eggyal Funziona, ma solo nella versione 14 (e più recente) del driver ODBC come ho scoperto per tentativi ed errori. –

risposta

1

Supponiamo di avere un file Excel (xlsx nel mio caso) che ha i seguenti nomi (Excel formula notazione):

  • myname
  • worksheet1!myname
  • worksheet2!myname

Diverse versioni del driver ODBC di Excel hanno un comportamento diverso:

Il Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) versione 12 che viene fornito con Microsoft Office 2007 si comporta in questo modo:

Gli spazi dei nomi sono appiattite.

Tutto ciò che è possibile interrogare è SELECT * FROM myname. Apparentemente questo restituisce i dati dal nome che viene definito.

Il Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) versione 14 che viene fornito con Microsoft Office 2010 (and can be downloaded separatly from Microsoft) si comporta in questo modo:

Si può infatti interrogare tutti e tre:

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

Quindi questo è stato apparentemente fissato in Microsoft Office 2010.

La correzione non è retrocompatibile. Quando nel 2007 è stato definito un nome del campo di lavoro definito, è possibile eseguire una query utilizzando la sintassi che funziona solo per i nomi con ambito di cartella di lavoro nel 2010. Pertanto è necessario prestare attenzione quando si gestisce questa situazione tra diverse versioni di Office.

Nota: se il collegamento per il download diventa mai guasto, cercare Microsoft Access Database Engine 2010 Redistributable.

1

Provare le seguenti operazioni per aiutare a capire il nome Delphi sta cercando.

  1. Eliminare una casella combinata in un modulo.
  2. Eseguire il seguente codice per compilare la casella combinata con i nomi che Delphi accetterà: AdoConnection1.GetTableNames(ComboBox1.Items,True);
  3. Eseguire l'app. La casella combinata dovrebbe fornire un elenco di nomi interrogabili.

Utilizzo di Delphi XE2 e Office 2010 (file excel salvato come ufficio 97 formato xls) Ho creato un intervallo denominato scopeheet denominato sheet1! Numberlist e ho eseguito una query ADO in Delphi. La query era SELECT * FROM [sheet1$numberlist]. Forse è il tuo driver ODBC?

+0

Ci sono in effetti diversi driver ODBC, controllerò questo. La chiamata a GetTableNames è una buona idea. –

+0

Il driver che sto utilizzando è 'Driver Microsoft Excel (* .xls, * .xlsx, * .xlsm, * .xlsb)' Versione '12.00.6606.1000' –

+0

La sintassi funziona in Office 2010 e versioni successive, vedere la mia risposta. –

Problemi correlati