Come eseguire query e aggiornare dati di Excel usando ADO da ASP

Riepilogo

Questo articolo illustra come eseguire query e aggiornare informazioni in un foglio di calcolo di Excel usando ActiveX Data Objects (ADO) da una pagina ASP (Active Server Pages). L'articolo descrive anche le limitazioni associate a questo tipo di applicazione.

Importante

Anche se le applicazioni ASP/ADO supportano l'accesso multiutente, un foglio di calcolo di Excel no. Pertanto, questo metodo di query e aggiornamento delle informazioni non supporta l'accesso simultaneo multiutente.

Ulteriori informazioni

Per accedere ai dati nel foglio di calcolo di Excel per questo esempio, usare Microsoft ODBC Driver for Excel. Creare una tabella per accedere ai dati creando un intervallo denominato nel foglio di calcolo di Excel.

Passaggi per creare un'applicazione di esempio

  • Creare il file di Excel ADOtest.xls con i dati seguenti in sheet1:

    column1 column2 column3
    Rr Questo 15
    Bb test 20
    Ee Funziona 25

    Nota

    Se una colonna nel foglio di calcolo di Excel contiene sia testo che numeri, il driver ODBC di Excel non può interpretare correttamente il tipo di dati che deve essere la colonna. Assicurarsi che tutte le celle di una colonna siano dello stesso tipo di dati. I tre errori seguenti possono verificarsi se ogni cella di una colonna non è dello stesso tipo o se i tipi sono mescolati tra "text" e "general":

    1. Errore '80040e21' del provider Microsoft OLE DB per i driver ODBC Le proprietà della richiesta non possono essere supportate da questo driver ODBC.
    2. Errore '80004005' del provider Microsoft OLE DB per i driver ODBC La query non è aggiornabile perché non contiene colonne ricercabili da usare come chiave di speranza.
    3. Errore del provider Microsoft OLE DB per driver ODBC "80004005" Aggiornamento basato su query non riuscito. Impossibile trovare la riga da aggiornare.
  • Creare un intervallo denominato, myRange1, nel foglio di calcolo:

    1. Evidenziare le righe e le colonne in cui si trovano i dati.
    2. Scegliere Nome dal menu Inserisci e fare clic su Definisci.
    3. Immettere il nome myRange1 per il nome dell'intervallo denominato.
    4. Fare clic su OK.

    L'intervallo denominato myRange1 contiene i dati seguenti:

    column1 column2 column3
    Rr Questo 15
    Bb test 20
    Ee Funziona 25

    Nota

    • ADO presuppone che la prima riga di una query di Excel contenga le intestazioni di colonna. Pertanto, l'intervallo denominato deve includere le intestazioni di colonna. Si tratta di un comportamento diverso da DAO.
    • Le intestazioni di colonna non possono essere un numero. Il driver di Excel non può interpretarli e, invece, restituisce un riferimento di cella. Ad esempio, un'intestazione di colonna "F1" verrebbe interpretata in modo errato.
  • Creare un DSN (System Data Source Name) ODBC che punta al file ADOTest.xls.

    1. Dal Pannello di controllo aprire l'amministratore ODBC.
    2. Nella scheda DSN di sistema fare clic su Aggiungi.
    3. Selezionare Microsoft Excel Driver (*.xls) e fare clic su Fine. Se questa opzione non esiste, è necessario installare il driver MICROSOFT ODBC per Excel dal programma di installazione di Excel.
    4. Scegliere ADOExcel come nome origine dati.
    5. Verificare che la versione sia impostata sulla versione corretta di Excel.
    6. Fare clic su "Seleziona cartella di lavoro...", passare al file ADOTest.xls e fare clic su OK.
    7. Fare clic sul pulsante "Opzioni>>" e deselezionare la casella di controllo "Sola lettura".
    8. Fare clic su OK e quindi fare di nuovo clic su OK.
  • Impostare le autorizzazioni per il file ADOTest.xls.

Se si accede alla pagina active server in modo anonimo, è necessario assicurarsi che l'account anonimo (IUSR_<MachineName>) disponga almeno dell'accesso di lettura/scrittura (RW) al foglio di calcolo. Se si desidera eliminare le informazioni dal foglio di calcolo, è necessario concedere le autorizzazioni di conseguenza.

Se si esegue l'autenticazione dell'accesso alla pagina Active Server, è necessario assicurarsi che tutti gli utenti che accedono all'applicazione dispongano delle autorizzazioni appropriate.

Se non si impostano le autorizzazioni appropriate nel foglio di calcolo, viene visualizzato un messaggio di errore simile al seguente:

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[Microsoft][ODBC Excel Driver] The Microsoft Jet database engine cannot open the file '(unknown)'. It is already opened exclusively by another user, or you need permission to view its data.
  1. Creare una nuova pagina ASP e incollarla nel codice seguente:

       <!-- Begin ASP Source Code -->
       <%@ LANGUAGE="VBSCRIPT" %>
       <%
         Set objConn = Server.CreateObject("ADODB.Connection")
         objConn.Open "ADOExcel"
    
    Set objRS = Server.CreateObject("ADODB.Recordset")
         objRS.ActiveConnection = objConn
         objRS.CursorType = 3                    'Static cursor.
         objRS.LockType = 2                      'Pessimistic Lock.
         objRS.Source = "Select * from myRange1"
         objRS.Open
    %>
    <br>
    <%
       Response.Write("Original Data")
    
    'Printing out original spreadsheet headings and values.
    
    'Note that the first recordset does not have a "value" property
       'just a "name" property.  This will spit out the column headings.
    
    Response.Write("<TABLE><TR>")
       For X = 0 To objRS.Fields.Count - 1
          Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>")
       Next
       Response.Write("</TR>")
       objRS.MoveFirst
    
    While Not objRS.EOF
          Response.Write("<TR>")
          For X = 0 To objRS.Fields.Count - 1
             Response.write("<TD>" & objRS.Fields.Item(X).Value)
          Next
          objRS.MoveNext
          Response.Write("</TR>")
       Wend
       Response.Write("</TABLE>")
    
    'The update is made here
    
    objRS.MoveFirst
       objRS.Fields(0).Value = "change"
       objRS.Fields(1).Value = "look"
       objRS.Fields(2).Value = "30"
       objRS.Update
    
    'Printing out spreadsheet headings and values after update.
    
    Response.Write("<br>Data after the update")
       Response.Write("<TABLE><TR>")
       For X = 0 To objRS.Fields.Count - 1
          Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>")
       Next
       Response.Write("</TR>")
       objRS.MoveFirst
    
    While Not objRS.EOF
          Response.Write("<TR>")
          For X = 0 To objRS.Fields.Count - 1
             Response.write("<TD>" & objRS.Fields.Item(X).Value)
          Next
          objRS.MoveNext
          Response.Write("</TR>")
       Wend
       Response.Write("</TABLE>")
    
    'ADO Object clean up.
    
    objRS.Close
       Set objRS = Nothing
    
    objConn.Close
       Set objConn = Nothing
    %>
    <!-- End ASP Source Code -->
    
  2. Salvare e denominare la pagina active server e visualizzarla nel browser. Verrà visualizzato quanto segue:

    Original Data:
    
    |column1|column2|column3|
    |------------|------------|------------|
    |rr|this|30|
    |bb|test|20|
    |tt|works|25|
    
    Data after the update:
    
    |column1|column2|column3|
    |------------|------------|------------|
    |change|look|30|
    |bb|test|20|
    |tt|works|25|
    

Nota

È stato eseguito un aggiornamento sulla prima riga dell'intervallo denominato (dopo le intestazioni).