Condividi tramite


Procedura dettagliata: modifica dei dati memorizzati nella cache di una cartella di lavoro di un server

Aggiornamento: novembre 2007

Si applica a

Le informazioni contenute in questo argomento riguardano solo i progetti Visual Studio Tools per Office e le versioni di Microsoft Office specificati.

Tipo di progetto

  • Progetti a livello di documento

Versione Microsoft Office

  • Excel 2007

  • Excel 2003

Per ulteriori informazioni, vedere la classe Funzionalità disponibili in base ai tipi di progetto e applicazione.

Questa procedura dettagliata illustra come utilizzare la classe ServerDocument per modificare un dataset memorizzato nella cache di una cartella di lavoro di Microsoft Office Excel senza avviare Excel. Vengono inoltre fornite istruzioni dettagliate sull'utilizzo degli esempi di codice contenuti in Procedura: modificare i dati memorizzati nella cache di una cartella di lavoro di un server.

Vengono illustrate le attività seguenti:

  • Definizione di un dataset contenente dati ottenuti dal database Microsoft SQL Server 2005 denominato AdventureWorksLT.

  • Creazione di istanze del dataset in un progetto Cartella di lavoro di Excel e in un progetto di applicazione console.

  • Creazione di un oggetto ListObject associato al dataset contenuto nella cartella di lavoro e popolazione di tale oggetto ListObject con dati all'apertura della cartella di lavoro.

  • Aggiunta del dataset contenuto nella cartella di lavoro nella cache di dati

  • Modifica di una colonna di dati del dataset memorizzato nella cache mediante l'esecuzione di codice nell'applicazione console, senza avviare Excel.

Anche se questa procedura dettagliata presuppone che si esegua il codice nel computer di sviluppo, il codice illustrato da questa procedura dettagliata può essere utilizzato in un server in cui non è stato installato Excel.

Nota:

Il computer potrebbe mostrare nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. L'edizione di Visual Studio in uso e le impostazioni utilizzate determinano questi elementi. Per ulteriori informazioni, vedere Impostazioni di Visual Studio.

Prerequisiti

Per completare la procedura dettagliata è necessario disporre dei componenti elencati di seguito.

Creazione di un progetto Libreria di classi che definisce un dataset

Per utilizzare lo stesso dataset sia in un progetto Cartella di lavoro di Excel sia in un'applicazione console è necessario definire il dataset in un assembly a parte a cui entrambi questi progetti fanno riferimento. Per questa procedura dettagliata, definire il dataset in un progetto Libreria di classi.

Per creare il progetto Libreria di classi

  1. Avviare Visual Studio.

  2. Scegliere Nuovo dal menu File, quindi scegliere Progetto.

  3. Nel riquadro Tipi progetto espandere Visual C# o Visual Basic e quindi fare clic su Windows.

  4. Nel riquadro Modelli selezionare Libreria di classi.

  5. Nella casella Nome digitare AdventureWorksDataSet.

  6. Fare clic su Sfoglia, passare alla cartella %UserProfile%\Documenti (per Windows XP e versioni precedenti e per Windows Vista) e quindi fare clic su Seleziona cartella.

  7. Assicurarsi che nella finestra di dialogo Nuovo progetto la casella di controllo Crea directory per soluzione non sia selezionata.

  8. Scegliere OK.

    Visual Studio aggiunge il progetto AdventureWorksDataSet in Esplora soluzioni e apre il file di codice Class1.cs o Class1.vb.

  9. In Esplora soluzioni, fare clic con il pulsante destro del mouse su Class1.cs o Class1.vb e quindi fare clic su Elimina. Per la presente procedura dettagliata, infatti, questo file non è necessario.

Definizione di un dataset nel progetto Libreria di classi

Definire un dataset tipizzato che contiene dati ottenuti dal database SQL Server 2005 denominato AdventureWorksLT. Più avanti in questa procedura dettagliata si farà riferimento a questo dataset da un progetto Cartella di lavoro di Excel e da un progetto di applicazione console.

Il dataset è un dataset tipizzato che rappresenta i dati contenuti nella tabella Product del database AdventureWorksLT. Per ulteriori informazioni sui dataset tipizzati, vedere Cenni preliminari sui dataset in Visual Studio.

Per definire un dataset tipizzato nel progetto Libreria di classi

  1. Fare clic sul progetto AdventureWorksDataSet in Esplora soluzioni.

  2. Scegliere Aggiungi nuova origine dati dal menu Dati.

    Verrà avviata la Configurazione guidata origine dati.

  3. Fare clic su Database, quindi scegliere Avanti.

  4. Se già si dispone di una connessione al database AdventureWorksLT, scegliere questa connessione e fare clic su Avanti.

    In caso contrario, fare clic su Nuova connessione e utilizzare la finestra di dialogo Aggiungi connessione per creare la nuova connessione. Per ulteriori informazioni, vedere Procedura: creare connessioni a database di SQL Server.

  5. Scegliere Avanti nella pagina Salva stringa di connessione nel file di configurazione dell'applicazione.

  6. Nella pagina Seleziona oggetti di database, espandere Tabelle e selezionare Product (SalesLT).

  7. Scegliere Fine.

    Il file AdventureWorksLTDataSet.xsd viene aggiunto al progetto AdventureWorksDataSet. Questo file definisce gli elementi seguenti:

    • Un dataset tipizzato denominato AdventureWorksLTDataSet. Questo dataset rappresenta il contenuto della tabella Product contenuta nel database AdventureWorksLT.

    • Un TableAdapter denominato ProductTableAdapter. Questo TableAdapter può essere utilizzato per leggere e scrivere dati in AdventureWorksLTDataSet. Per ulteriori informazioni, vedere la classe Cenni preliminari sugli oggetti TableAdapter.

    Più avanti nella presente procedura questi oggetti verranno utilizzati entrambi.

  8. In Esplora soluzioni fare clic con il pulsante destro del mouse su AdventureWorksDataSet, quindi scegliere Compila.

    Verificare che il progetto venga compilato senza errori.

Creazione di un progetto Cartella di lavoro di Excel

Creare un progetto Cartella di lavoro di Excel da utilizzare come interfaccia per i dati. Più avanti in questa procedura si creerà un ListObject che visualizza i dati e si aggiungerà un'istanza del dataset alla cache di dati della cartella di lavoro.

Per creare il progetto Cartella di lavoro di Excel

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione AdventureWorksDataSet, scegliere Aggiungi e quindi fare clic su Nuovo progetto.

  2. Nel riquadro Tipi progetto espandere Visual C# o Visual Basic e quindi Office.

  3. Nel computer di sviluppo, selezionare la cartella 2007 se si utilizza Excel 2007 o la cartella 2003 se si utilizza Excel 2003.

  4. Nel riquadro Modelli selezionare Cartella di lavoro di Excel.

  5. Nella casella Nome, digitare AdventureWorksReport. Non modificare il percorso.

  6. Scegliere OK.

    Verrà avviata la Creazione guidata progetto Visual Studio Tools per Office.

  7. Verificare che l'opzione Crea nuovo documento sia selezionata e fare clic su OK.

    Visual Studio apre la cartella di lavoro AdventureWorksReport nella finestra di progettazione e aggiunge il progetto AdventureWorksReport in Esplora soluzioni.

Aggiunta del dataset a origini dati contenute nel progetto Cartella di lavoro di Excel

Prima che sia possibile visualizzare il dataset contenuto nella cartella di lavoro di Excel, è necessario aggiungere il dataset alle origini dati contenute nel progetto Cartella di lavoro di Excel.

Per aggiungere il dataset alle origini dati contenute nel progetto Cartella di lavoro di Excel

  1. In Esplora soluzioni, fare doppio clic su Sheet1.cs o Sheet1.vb sotto il progetto AdventureWorksReport.

    La cartella di lavoro verrà aperta nella finestra di progettazione.

  2. Scegliere Aggiungi nuova origine dati dal menu Dati.

    Verrà avviata la Configurazione guidata origine dati.

  3. Fare clic su Oggetto e quindi su Avanti.

  4. Nella pagina Seleziona l'oggetto da associare fare clic su Aggiungi riferimento.

  5. Nella scheda Progetti, fare clic su AdventureWorksDataSet e quindi su OK.

  6. Sotto lo spazio dei nomi AdventureWorksDataSet dell'assembly AdventureWorksDataSet, fare clic su AdventureWorksLTDataSet e quindi su Fine.

    Verrà aperta la finestra Origini dati. Inoltre, AdventureWorksLTDataSet verrà aggiunto all'elenco di origini dati.

Creazione di un oggetto ListObject associato a un'istanza del dataset

Per visualizzare il dataset contenuto nella cartella di lavoro, creare un oggetto ListObject associato a un'istanza del dataset. Per ulteriori informazioni sull'associazione dei controlli ai dati, vedere Associazione di dati ai controlli.

Per creare un oggetto ListObject associato a un'istanza del dataset

  1. Nella finestra Origini dati espandere il nodo AdventureWorksLTDataSet sotto AdventureWorksDataSet.

  2. Selezionare il nodo Product, fare clic sulla freccia a discesa visualizzata e selezionare ListObject nell'elenco a discesa.

    Se la freccia a discesa non viene visualizzata, verificare che la cartella di lavoro sia aperta nella finestra di progettazione.

  3. Trascinare la tabella Product nella cella A1.

    Un controllo ListObject denominato productListObject viene creato nel foglio di lavoro a partire dalla cella A1. Contemporaneamente, al progetto vengono aggiunti un oggetto dataset denominato adventureWorksLTDataSet e un BindingSource denominato productBindingSource. Il controllo ListObject viene associato all'oggetto BindingSource, che a sua volta è associato all'oggetto dataset.

Aggiunta del dataset nella cache di dati

Per consentire al codice esterno al progetto Cartella di lavoro di Excel di accedere al dataset contenuto nella cartella di lavoro, è necessario aggiungere il dataset nella cache di dati. Per ulteriori informazioni sulla cache di dati, vedere Modello di dati nelle personalizzazioni a livello di documento e Memorizzazione di dati nella cache.

Per aggiungere il dataset nella cache di dati

  1. Nella finestra di progettazione, fare clic su adventureWorksLTDataSet.

  2. Nella finestra Proprietà, impostare la proprietà Modifiers su Public.

  3. Impostare la proprietà CacheInDocument su True.

Inizializzazione del dataset contenuto nella cartella di lavoro

Prima che sia possibile recuperare i dati dal dataset memorizzato nella cache tramite l'applicazione console, è necessario popolare con dati il dataset memorizzato nella cache.

Per inizializzare il dataset contenuto nella cartella di lavoro

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul file Sheet1.cs o Sheet1.vb e scegliere Visualizza codice.

  2. Sostituire il gestore eventi Sheet1_Startup con il codice riportato di seguito. Questo codice utilizza un'istanza della classe ProductTableAdapter definita nel progetto AdventureWorksDataSet per riempire con dati il dataset memorizzato nella cache, se attualmente è vuoto.

    Private ProductTableAdapter As New  _
        AdventureWorksDataSet.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter()
    
    Private Sub Sheet1_Startup(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Startup
        If Me.NeedsFill("AdventureWorksLTDataSet") Then
            Me.ProductTableAdapter.Fill(Me.AdventureWorksLTDataSet.Product)
        End If
    End Sub
    
    private AdventureWorksDataSet.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter productTableAdapter =
        new AdventureWorksDataSet.AdventureWorksLTDataSetTableAdapters.ProductTableAdapter();
    
    private void Sheet1_Startup(object sender, System.EventArgs e)
    {
        if (this.NeedsFill("adventureWorksLTDataSet"))
        {
            this.productTableAdapter.Fill(this.adventureWorksLTDataSet.Product);
        }
    }
    

Checkpoint

Compilare ed eseguire il progetto Cartella di lavoro di Excel per assicurarsi che sia la compilazione sia l'esecuzione vengano completate senza errori. Questa operazione comporta inoltre il riempimento del dataset memorizzato nella cache nonché il salvataggio dei dati nella cartella di lavoro.

Per compilare ed eseguire il progetto

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto AdventureWorksReport, scegliere Debug e quindi fare clic su Avvia nuova istanza.

    Il progetto verrà compilato e la cartella di lavoro verrà aperta in Excel. Verificare quanto segue:

    • ListObject è stato riempito con i dati.

    • Il valore della colonna ListPrice della prima riga di ListObject è 1431.5. Più avanti nella presente procedura dettagliata si utilizzerà un'applicazione console per modificare i valori contenuti nella colonna ListPrice.

  2. Salvare la cartella di lavoro. Non modificare il nome o il percorso del file della cartella di lavoro.

  3. Chiudere Excel.

Creazione di un progetto di applicazione console.

Creare un progetto di applicazione console da utilizzare per modificare i dati contenuti nel dataset memorizzato nella cache della cartella di lavoro.

Per creare un progetto di applicazione console

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione AdventureWorksDataSet, scegliere Aggiungi e quindi fare clic su Nuovo progetto.

  2. Nel riquadro Tipi progetto espandere Visual C# o Visual Basic e quindi fare clic su Windows.

  3. Nel riquadro Modelli selezionare Applicazione console.

  4. Nella casella Nome digitare DataWriter. Non modificare il percorso.

  5. Scegliere OK.

    Visual Studio aggiunge il progetto DataWriter in Esplora soluzioni e apre il file di codice Program.cs o Module1.vb.

Modifica dei dati contenuti nel dataset memorizzato nella cache tramite l'applicazione console

Utilizzare la classe ServerDocument nell'applicazione console per leggere i dati in un oggetto AdventureWorksLTDataSet locale. Quindi, dopo aver modificato tali dati, salvarli di nuovo nel dataset memorizzato nella cache.

Per modificare i dati contenuti nel dataset memorizzato nella cache

  1. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto DataWriter, quindi scegliere Aggiungi riferimento al servizio.

  2. Nella scheda .NET, selezionare uno degli assembly seguenti:

    • Se nel computer di sviluppo si utilizza Excel 2007, selezionare Microsoft.VisualStudio.Tools.Applications.ServerDocument.v9.0.

    • Se invece si utilizza Excel 2003, selezionare Microsoft.VisualStudio.Tools.Applications.Runtime.

    Questi assembly definiscono versioni diverse della classe ServerDocument che vengono utilizzate da progetti per Microsoft Office System 2007 e Microsoft Office 2003. Per ulteriori informazioni, vedere Gestione dei documenti di un server utilizzando la classe ServerDocument.

  3. Scegliere OK.

  4. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto DataWriter. Quindi, scegliere Aggiungi riferimento al servizio.

  5. Nella scheda Progetti, selezionare AdventureWorksDataSet e fare clic su OK.

  6. Aprire il file Program.cs o Module1.vb nell'editor di codice.

  7. Aggiungere l'istruzione using (per C#) o Imports (per Visual Basic) seguente all'inizio del file di codice.

    Imports Microsoft.VisualStudio.Tools.Applications
    
    using Microsoft.VisualStudio.Tools.Applications;
    
  8. Aggiungere al metodo Main il seguente codice. Questo codice dichiara gli oggetti seguenti:

    • Un'istanza di tipo AdventureWorksLTDataSet definita nel progetto AdventureWorksDataSet.

    • Il percorso della cartella di lavoro AdventureWorksReport contenuta nella cartella di compilazione del progetto AdventureWorksReport.

    • Un oggetto ServerDocument da utilizzare per accedere alla cache di dati nella cartella di lavoro.

      Nota:

      Il codice seguente presuppone che si utilizzi una cartella di lavoro di Excel 2007 con estensione XLSX. Se la cartella di lavoro contenuta nel progetto presenta un'estensione di file diversa, modificare il percorso di conseguenza.

    Dim productDataSet As New AdventureWorksDataSet.AdventureWorksLTDataSet()
    Dim workbookPath As String = System.Environment.GetFolderPath( _
        Environment.SpecialFolder.MyDocuments) & _
        "\AdventureWorksReport\bin\Debug\AdventureWorksReport.xlsx"
    Dim serverDocument1 As ServerDocument = Nothing
    
    AdventureWorksDataSet.AdventureWorksLTDataSet productDataSet =
        new AdventureWorksDataSet.AdventureWorksLTDataSet();
    string workbookPath = System.Environment.GetFolderPath(
        Environment.SpecialFolder.MyDocuments) +
        @"\AdventureWorksReport\bin\Debug\AdventureWorksReport.xlsx";
    ServerDocument serverDocument1 = null;
    
  9. Aggiungere il codice seguente nel metodo Main dopo il codice aggiunto nel passaggio precedente. Mediante il codice vengono effettuate le seguenti operazioni:

    • La proprietà CachedData della classe ServerDocument viene utilizzata per accedere al dataset memorizzato nella cache della cartella di lavoro.

    • I dati vengono letti dal dataset memorizzato nella cache e inseriti nel dataset locale.

    • Il valore ListPrice di ogni prodotto contenuto nella tabella Product del dataset viene modificato.

    • Le modifiche apportate al dataset memorizzato nella cache della cartella di lavoro vengono salvate.

    Try
        serverDocument1 = New ServerDocument(workbookPath)
        Dim dataHostItem1 As CachedDataHostItem = _
            serverDocument1.CachedData.HostItems("AdventureWorksReport.Sheet1")
        Dim dataItem1 As CachedDataItem = dataHostItem1.CachedData("AdventureWorksLTDataSet")
    
        If dataItem1 IsNot Nothing Then
            Console.WriteLine("Before reading data from the cache dataset, the local dataset has " & _
                "{0} rows.", productDataSet.Product.Rows.Count.ToString())
    
            ' Read the cached data from the worksheet dataset into the local dataset.
            Dim schemaReader As New System.IO.StringReader(dataItem1.Schema)
            Dim xmlReader As New System.IO.StringReader(dataItem1.Xml)
            productDataSet.ReadXmlSchema(schemaReader)
            productDataSet.ReadXml(xmlReader)
    
            Console.WriteLine("After reading data from the cache dataset, the local dataset has " & _
                "{0} rows.", productDataSet.Product.Rows.Count.ToString())
    
            ' Modify the prices of each product in the local dataset.
            Dim row As AdventureWorksDataSet.AdventureWorksLTDataSet.ProductRow
            For Each row In productDataSet.Product.Rows
                If row.ProductCategoryID < 20 Then
                    row.ListPrice = row.ListPrice + row.ListPrice * 0.1
                Else
                    row.ListPrice = row.ListPrice - row.ListPrice * 0.1
                End If
            Next row
    
            ' Write the modified local dataset to the worksheet dataset using the DiffGram format.
            Dim stringIn As New System.Text.StringBuilder()
            Dim stringOut As New System.IO.StringWriter(stringIn)
            productDataSet.WriteXml(stringOut, System.Data.XmlWriteMode.DiffGram)
            dataItem1.Xml = stringIn.ToString()
    
            serverDocument1.Save()
            Console.WriteLine("The product prices have been modified.")
        Else
            Console.WriteLine("The data object is not found in the data cache.")
        End If
    Catch ex As System.IO.FileNotFoundException
        Console.WriteLine("The specified workbook does not exist.")
    Catch ex As System.Xml.XmlException
        Console.WriteLine("The data object has invalid XML information.")
    Finally
        If Not (serverDocument1 Is Nothing) Then
            serverDocument1.Close()
        End If
        Console.WriteLine(vbLf & vbLf & "Press Enter to close the application.")
        Console.ReadLine()
    End Try
    
    try
    {
        serverDocument1 = new ServerDocument(workbookPath);
        CachedDataHostItem dataHostItem1 =
            serverDocument1.CachedData.HostItems["AdventureWorksReport.Sheet1"];
        CachedDataItem dataItem1 = dataHostItem1.CachedData["adventureWorksLTDataSet"];
    
        if (dataItem1 != null)
        {
            Console.WriteLine("Before reading data from the cache dataset, the local dataset has " +
                "{0} rows.", productDataSet.Product.Rows.Count.ToString());
    
            // Read the cached data from the worksheet dataset into the local dataset.
            System.IO.StringReader schemaReader = new System.IO.StringReader(dataItem1.Schema);
            System.IO.StringReader xmlReader = new System.IO.StringReader(dataItem1.Xml);
            productDataSet.ReadXmlSchema(schemaReader);
            productDataSet.ReadXml(xmlReader);
    
            Console.WriteLine("After reading data from the cache dataset, the local dataset has " +
                "{0} rows.", productDataSet.Product.Rows.Count.ToString());
    
            // Modify the prices of each product in the local dataset.
            foreach (AdventureWorksDataSet.AdventureWorksLTDataSet.ProductRow row in 
                     productDataSet.Product.Rows)
            {
                if (row.ProductCategoryID < 20)
                {
                    row.ListPrice = row.ListPrice + (row.ListPrice * (Decimal).10);
                }
                else
                {
                    row.ListPrice = row.ListPrice - (row.ListPrice * (Decimal).10);
                }
            }
    
            // Write the modified local dataset to the worksheet dataset using the DiffGram format.
            System.Text.StringBuilder stringIn = new System.Text.StringBuilder();
            System.IO.StringWriter stringOut = new System.IO.StringWriter(stringIn);
            productDataSet.WriteXml(stringOut, System.Data.XmlWriteMode.DiffGram);
            dataItem1.Xml = stringIn.ToString();
    
            serverDocument1.Save();
            Console.WriteLine("The product prices have been modified.");
        }
        else
        {
            Console.WriteLine("The data object is not found in the data cache.");
        }
    }
    catch (System.IO.FileNotFoundException)
    {
        Console.WriteLine("The specified workbook does not exist.");
    }
    catch (System.Xml.XmlException)
    {
        Console.WriteLine("The data object has invalid XML information.");
    }
    finally
    {
        if (serverDocument1 != null)
        {
            serverDocument1.Close();
        }
    
        Console.WriteLine("\n\nPress Enter to close the application.");
        Console.ReadLine();
    }
    
  10. In Esplora soluzioni, fare clic con il pulsante destro del mouse sul progetto DataWriter, scegliere Debug e quindi fare clic su Avvia nuova istanza.

    L'applicazione console visualizzerà alcuni messaggi mentre legge il contenuto del dataset memorizzato nella cache e lo inserisce nel dataset locale, modificherà i prezzi dei prodotti contenuti nel dataset locale e salverà i nuovi valori nel dataset memorizzato nella cache. Premere INVIO per chiudere l'applicazione.

Test della cartella di lavoro

Quando si apre la cartella di lavoro, ListObject visualizza le modifiche apportate alla colonna di dati ListPrice del dataset memorizzato nella cache.

Per eseguire il test della cartella di lavoro

  1. Se è ancora aperta, chiudere la cartella di lavoro AdventureWorksReport nella finestra di progettazione di Visual Studio.

  2. Aprire la cartella di lavoro AdventureWorksReport contenuta nella cartella di compilazione del progetto AdventureWorksReport. Per impostazione predefinita, la cartella di compilazione si trova in uno dei percorsi seguenti:

    • %UserProfile%\Documenti\AdventureWorksReport\bin\Debug (per Windows XP e versioni precedenti)

    • %UserProfile%\Documenti\AdventureWorksReport\bin\Debug (per Windows Vista)

  3. Verificare che il valore indicato nella colonna ListPrice della prima riga di ListObject sia 1574.65.

  4. Chiudere la cartella di lavoro.

Passaggi successivi

Gli argomenti elencati di seguito offrono ulteriori informazioni sull'utilizzo di dati memorizzati nella cache:

Vedere anche

Attività

Procedura: inserire dati in una cartella di lavoro sul server

Procedura: recuperare i dati memorizzati nella cache di una cartella di lavoro di un server

Procedura dettagliata: inserimento di dati in una cartella di lavoro di un server

Procedura: inserire dati nei documenti senza scriverli sul disco

Concetti

Cenni preliminari sulla connessione ai dati in Visual Studio