PRB: "L'operazione deve usare una query aggiornabile" quando si accede a Excel tramite ODBC

Sintomi

Quando si modifica un foglio di lavoro di Excel tramite ADO e ODBC, è possibile che venga visualizzato il messaggio di errore seguente se si usa un oggetto ADO DataControl:

[Microsoft][ODBC Excel Driver] Operation must use an updateable query.

Se si utilizza un oggetto Recordset generato con codice ADO, è possibile che venga visualizzato il messaggio di errore seguente quando si modifica un foglio di lavoro di Excel tramite ADO e ODBC:

Run-time error '-2147467259(80004005)': [Microsoft][ODBC Excel Driver] Operation must use an updateable query.

Causa

Questo problema si verifica se si tenta di modificare un foglio di lavoro salvato o aperto come ReadOnly.

Nota

ReadOnly è l'impostazione predefinita per una connessione ODBC a Excel, con o senza un nome di origine dati (DSN). Pertanto, l'utente deve sempre modificare tale impostazione per modificare i dati.

Risoluzione

Per risolvere il problema, usare i metodi seguenti:

  • Assicurarsi che la proprietà LockType dell'oggetto Recordset non sia impostata su ReadOnly.

  • Assicurarsi che il file che si sta tentando di aprire non sia salvato come ReadOnly.

  • Se ci si connette tramite un DSN, seguire questa procedura:

    1. Aprire Pannello di controllo e quindi fare clic su Amministratore origine dati ODBC.
    2. Fare doppio clic sul DSN.
    3. Nella finestra di dialogo Installazione odbc di Microsoft Excel fare clic su Opzioni.
    4. Assicurarsi che la casella di controllo ReadOnly non sia selezionata.
  • Se si usa una connessione senza DSN, assicurarsi di includere l'opzione "ReadOnly=0" nel stringa di connessione. Ad esempio:

    cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=C:\MyDoc.xls;ReadOnly=0;"
    

Stato

Si tratta di un comportamento legato alla progettazione del prodotto.

Ulteriori informazioni

Passaggi per riprodurre il comportamento

  1. Creare un nuovo progetto EXE Standard in Visual Basic.

  2. Scegliere Riferimenti dal menu Progetto e quindi aggiungere un riferimento a Microsoft ActiveX Data Objects Library.

  3. Aggiungere un pulsante Di comando a Form1.

  4. Aggiungere il codice seguente a Form1:

    Dim rs As ADODB.Recordset
    Dim cn As ADODB.Connection
    
    Private Sub Form_Load()
      Command1.Caption = "Edit"
    End Sub
    
    Private Sub Command1_Click()
      Dim DocPath As String
    
      DocPath = App.Path & "\Test.xls"
    
      Set cn = New Connection
      Set rs = New Recordset
    
      cn.Open "Driver={Microsoft Excel Driver (*.xls)};DBQ=" & DocPath & ";ReadOnly=1"
      rs.LockType = adLockOptimistic
      rs.Open "TB1", cn
      rs.AddNew
      rs.Fields(1).Value = "New Value"
      rs.Update
    
      rs.Close
      cn.Close
      Set rs = Nothing
      Set cn = Nothing
    End Sub  
    
  5. Salvare l'applicazione.

  6. Creare un nuovo foglio di lavoro di Excel e quindi salvare il foglio di lavoro come Test.xls.

  7. Scegliere Nome dal menu Inserisci e quindi fare clic su Definisci.

  8. Creare una nuova tabella all'interno del foglio di lavoro di Excel e quindi denominare la tabella TB1.

  9. Salvare il foglio di lavoro nella stessa cartella dell'applicazione Visual Basic.

  10. Premere F5 per eseguire l'applicazione.

Riferimenti

Per altre informazioni, vedere l'articolo seguente:

Office Space: suggerimenti e consigli per lo scripting di applicazioni di Microsoft Office