Condividi tramite


Procedura dettagliata: Creare un'applicazione dati a più livelli con ADO.NET e .NET Framework

Nota

I set di dati e le classi correlate sono tecnologie .NET Framework legacy dei primi anni '2000 che consentono alle applicazioni di lavorare con i dati in memoria mentre le applicazioni vengono disconnesse dal database. Le tecnologie sono particolarmente utili per le applicazioni che consentono agli utenti di modificare i dati e rendere persistenti le modifiche apportate al database. Anche se i set di dati hanno dimostrato di essere una tecnologia molto efficace, è consigliabile che le nuove applicazioni .NET usino Entity Framework Core. Entity Framework offre un modo più naturale per usare i dati tabulari come modelli a oggetti e ha un'interfaccia di programmazione più semplice.

Le applicazioni dati a più livelli sono applicazioni con accesso ai dati e sono separate in più livelli logici. La separazione dei componenti dell'applicazione in livelli discreti aumenta la manutenibilità e la scalabilità dell'applicazione mediante l'adozione semplificata di nuove tecnologie che possono essere applicate a un singolo livello senza la necessità di riprogettare l'intera soluzione. L'architettura a più livelli include un livello di presentazione, un livello intermedio e un livello dati. Il livello intermedio include in genere un livello di accesso ai dati, un livello di logica di business e componenti condivisi quali l'autenticazione e la convalida. Il livello dati include un database relazionale. Le applicazioni a più livelli in genere archiviano le informazioni riservate nel livello di accesso ai dati del livello intermedio per mantenere l'isolamento dagli utenti finali che accedono al livello di presentazione. Per altre informazioni, vedere Panoramica delle applicazioni dati a più livelli.

Per separare i vari livelli in un'applicazione a più livelli, è possibile creare progetti discreti per ogni livello da includere nell'applicazione. I dataset tipizzati contengono una proprietà DataSet Project che determina in quali progetti deve essere inserito il codice generato del dataset e di TableAdapter.

In questa procedura dettagliata è illustrato come separare il codice del dataset e di TableAdapter in progetti di librerie di classi discreti usando Progettazione DataSet. Dopo aver separato il set di dati e il codice TableAdapter, creare un servizio Windows Communication Foundation Services e WCF Data Services nel servizio Visual Studio per chiamare nel livello di accesso ai dati. Infine, si crea un'applicazione Windows Form come livello presentazione. Questo livello accede ai dati dal servizio dati.

Durante questa procedura dettagliata, seguire questa procedura:

  • Creare una nuova soluzione a più livelli che contiene più progetti.

  • Aggiungere due progetti di libreria di classi alla soluzione a più livelli.

  • Creare un dataset tipizzato con la Configurazione guidata origine dati.

  • Separare i TableAdapter generati e il codice del set di dati in progetti discreti.

  • Creare un servizio Windows Communication Foundation (WCF) per effettuare chiamate nel livello di accesso ai dati.

  • Creare funzioni nel servizio per recuperare i dati dal livello di accesso ai dati.

  • Creare un'applicazione Windows Form come livello di presentazione.

  • Creare i controlli Windows Form associati all'origine dati.

  • Scrivere il codice per popolare le tabelle dati.

Prerequisiti

Per completare questa esercitazione, sono necessari i carichi di lavoro sviluppo per desktop .NET e Archiviazione dati ed elaborazione dei dati installati in Visual Studio. Per installarli, aprire Programma di installazione di Visual Studio e scegliere Modifica (o Altro>modifica) accanto alla versione di Visual Studio da modificare. Vedere Modificare Visual Studio.

Questa procedura dettagliata usa SQL Server Express LocalDB e il database di esempio Northwind.

  1. Se SQL Server Express LocalDB non è disponibile, installarlo dalla pagina di download di SQL Server Express o tramite il Programma di installazione di Visual Studio. Nella Programma di installazione di Visual Studio è possibile installare SQL Server Express LocalDB come parte del carico di lavoro sviluppo di applicazioni desktop .NET o come singolo componente.

  2. Installare il database di esempio Northwind seguendo questa procedura:

    1. In Visual Studio aprire la finestra Esplora oggetti di SQL Server. SQL Server Esplora oggetti viene installato come parte del carico di lavoro Archiviazione ed elaborazione dei dati nel Programma di installazione di Visual Studio. Espandere il nodo SQL Server. Fare clic con il pulsante destro del mouse sull'istanza di LocalDB e scegliere Nuova query.

      Verrà visualizzata una finestra dell'editor di query.

    2. Copiare lo script Transact-SQL Northwind negli Appunti. Questo script T-SQL crea il database Northwind da zero e lo popola con i dati.

    3. Incollare lo script T-SQL nell'editor di query e quindi scegliere il pulsante Esegui .

      Dopo un breve periodo di tempo, la query termina l'esecuzione e viene creato il database Northwind.

    1. In Visual Studio aprire la finestra Esplora oggetti di SQL Server. SQL Server Esplora oggetti viene installato come parte del carico di lavoro Archiviazione ed elaborazione dei dati nel Programma di installazione di Visual Studio. Espandere il nodo SQL Server. Fare clic con il pulsante destro del mouse sull'istanza di LocalDB e scegliere Nuova query.

      Se l'istanza di LocalDB non viene visualizzata, usare il pulsante della barra degli strumenti Aggiungi SQL Server. Verrà visualizzata la finestra di dialogo. Nella finestra di dialogo espandere Locale e scegliere MSSQLLocalDB. Immettere le credenziali appropriate. È possibile lasciare la scelta predefinita per il database.

      Screenshot della finestra di dialogo Connetti a database SQL

    2. Scegliere Connetti. Viene aggiunto un nodo per LocalDB in SQL Server Esplora oggetti.

    3. Fare clic con il pulsante destro del mouse sull'istanza di LocalDB e scegliere Nuova query.

      Verrà visualizzata una finestra dell'editor di query.

    4. Copiare lo script Transact-SQL Northwind negli Appunti. Questo script T-SQL crea il database Northwind da zero e lo popola con i dati.

    5. Incollare lo script T-SQL nell'editor di query e quindi scegliere il pulsante Esegui .

      Dopo un breve periodo di tempo, la query termina l'esecuzione e viene creato il database Northwind.

Creare la soluzione a più livelli e la libreria di classi per contenere il set di dati (DataEntityTier)

Il primo passaggio di questa procedura dettagliata prevede la creazione di una soluzione e di due progetti di libreria di classi. La prima libreria di classi contiene il set di dati (la classe tipizzata DataSet generata e dataTable che contengono i dati dell'applicazione). Il progetto viene usato come livello di entità di dati dell'applicazione e di norma si trova nel livello intermedio. Il set di dati crea il set di dati iniziale e separa automaticamente il codice nelle due librerie di classi.

Nota

Assicurarsi di assegnare il nome corretto al progetto e alla soluzione prima di fare clic su OK. In tal modo sarà più semplice completare questa procedura dettagliata.

Per creare la soluzione a più livelli e la libreria di classi DataEntityTier

  1. In Visual Studio creare un progetto usando il modello di progetto Windows Form App (.NET Framework) per C# o Visual Basic. .NET Core, .NET 5 e versioni successive non sono supportati.

  2. Assegnare il nome DataEntityTier al progetto.

  3. Assegnare alla soluzione il nome NTierWalkthrough e quindi scegliere OK.

    Una soluzione NTierWalkthrough che contiene il progetto DataEntityTier viene creata e aggiunta a Esplora soluzioni.

Creare la libreria di classi per contenere gli oggetti TableAdapters (DataAccessTier)

Il passaggio successivo alla creazione del progetto DataEntityTier prevede la creazione di un altro progetto di libreria di classi. Questo progetto contiene gli oggetti TableAdapter generati ed è denominato livello di accesso ai dati dell'applicazione. Tale livello contiene le informazioni richieste per la connessione al database e in genere si trova nel livello intermedio.

Per creare una libreria di classi separata per gli oggetti TableAdapter

  1. Fare clic con il pulsante destro del mouse sulla soluzione in Esplora soluzioni e scegliere Aggiungi>Nuovo progetto.

  2. Scegliere il modello di progetto Libreria di classi (.NET Framework).

  3. Assegnare al progetto il nome DataAccessTier e scegliere OK.

    Il progetto DataAccessTier viene creato e aggiunto alla soluzione NTierWalkthrough.

Creare il set di dati

Il passaggio successivo consiste nella creazione di un dataset tipizzato. I set di dati tipizzato vengono creati con sia la classe del set di dati (incluse DataTables le classi) che le TableAdapter classi in un singolo progetto. Tutte le classi vengono generate in un singolo file. Quando si separano il set di dati e gli oggetti TableAdapter in progetti diversi, si tratta della classe del set di dati spostata nell'altro progetto, lasciando le TableAdapter classi nel progetto originale. Creare quindi il set di dati nel progetto che conterrà in definitiva gli oggetti TableAdapter (il progetto DataAccessTier). Per creare il set di dati, usare la Configurazione guidata origine dati.

Nota

Per creare la connessione, è necessario avere accesso al database di esempio Northwind. Per informazioni su come configurare il database di esempio Northwind, vedere Procedura: Installare database di esempio.

Per creare il set di dati

  1. Selezionare DataAccessTier in Esplora soluzioni.

  2. Scegliere Mostra origini dati dal menu Dati.

    Verrà visualizzata la finestra Origini dati.

  3. Nella finestra Origini dati selezionare Aggiungi nuova origine dati per avviare la Configurazione guidata origine dati.

  4. Nella pagina Scegliere un tipo di origine dati selezionare Database e quindi avanti.

  5. Nella pagina Seleziona connessione dati eseguire una delle operazioni seguenti:

    Se nell'elenco a discesa è disponibile una connessione dati al database di esempio Northwind, selezionarla.

    or

    Selezionare Nuova connessione per aprire la finestra di dialogo Aggiungi connessione .

  6. Se il database richiede una password, selezionare l'opzione per includere i dati sensibili e quindi scegliere Avanti.

    Nota

    Se è stato selezionato un file di database locale al posto della connessione a SQL Server, potrebbe venire richiesto di aggiungere il file al progetto. Scegliere per aggiungere il file di database al progetto.

  7. Selezionare Avanti nella pagina Salva la stringa di connessione nel file di configurazione dell'applicazione.

  8. Espandere il nodo Tabelle nella pagina Seleziona oggetti di database .

  9. Selezionare le caselle di controllo per le tabelle Clienti e Ordini e quindi scegliere Fine.

    NorthwindDataSet viene aggiunto al progetto DataAccessTier e viene visualizzato nella finestra Origini dati.

Separare gli oggetti TableAdapter dal set di dati

Dopo avere creato il dataset, separare la classe DataSet generata dagli oggetti TableAdapter. Questa operazione può essere eseguita impostando la proprietà Progetto DataSet sul nome del progetto nel quale archiviare la classe DataSet separata.

Per separare gli oggetti TableAdapter dal dataset

  1. Fare doppio clic su NorthwindDataSet.xsd in Esplora soluzioni per aprire il dataset in Progettazione DataSet.

  2. Selezionare un'area vuota nella finestra di progettazione.

  3. Trovare il nodo Progetto DataSet nella finestra Proprietà.

  4. Nell'elenco Progetto DataSet selezionare DataEntityTier.

  5. Scegliere Compila soluzione dal menu Compila.

    Il dataset e gli oggetti TableAdapter sono separati nei due progetti di libreria di classi. Il progetto che originariamente conteneva l'intero set di dati (DataAccessTier) ora contiene solo gli oggetti TableAdapter. Il progetto designato nella proprietà Progetto DataSet (DataEntityTier) contiene il set di dati tipizzato: NorthwindDataSet.Dataset.Designer.vb (o NorthwindDataSet.Dataset.Designer.cs).

Nota

Quando si separano i dataset e gli oggetti TableAdapter (impostando la proprietà Progetto DataSet), le classi parziali del dataset presenti nel progetto non vengono spostate automaticamente. Le classi parziali del dataset devono essere spostate manualmente nel progetto di dataset.

Creare una nuova applicazione di servizio

Questa procedura dettagliata illustra come accedere al livello di accesso ai dati usando un servizio WCF, quindi si creerà una nuova applicazione di servizio WCF.

Per creare una nuova applicazione del servizio WCF

  1. Fare clic con il pulsante destro del mouse sulla soluzione in Esplora soluzioni e scegliere Aggiungi>Nuovo progetto.

  2. Nel riquadro sinistro della finestra di dialogo Nuovo progetto selezionare WCF. Nel riquadro centrale selezionare Libreria di servizi WCF.

  3. Assegnare al progetto il nome DataService e selezionare OK.

    Il progetto DataService viene creato e aggiunto alla soluzione NTierWalkthrough.

Creare metodi nel livello di accesso ai dati per restituire i dati dei clienti e degli ordini

Il servizio dati deve chiamare due metodi nel livello di accesso ai dati: GetCustomers e GetOrders. Questi metodi restituiscono le tabelle Northwind Customers e Orders . Creare i GetCustomers metodi e GetOrders nel DataAccessTier progetto.

Per creare un metodo nel livello di accesso ai dati per restituire la tabella Customers

  1. In Esplora soluzioni fare doppio clic su NorthwindDataset.xsd per aprire il set di dati.

  2. Fare clic con il pulsante destro del mouse su CustomersTableAdapter e scegliere Aggiungi query.

  3. Nella pagina Seleziona un tipo di comando lasciare il valore predefinito Usa istruzioni SQL e fare clic su Avanti.

  4. Nella pagina Seleziona un tipo di query lasciare il valore predefinito SELECT che restituisce righe e fare clic su Avanti.

  5. Nella pagina Specifica un'istruzione SQL SELECT lasciare la query predefinita e fare clic su Avanti.

  6. Nella sezione Restituisci un DataTable della pagina Scegliere i metodi per generare digitare GetCustomers in Nome metodo.

  7. Fare clic su Fine.

Per creare un metodo nel livello di accesso ai dati per restituire la tabella Orders

  1. Fare clic con il pulsante destro del mouse su OrdersTableAdapter e scegliere Aggiungi query.

  2. Nella pagina Seleziona un tipo di comando lasciare il valore predefinito Usa istruzioni SQL e fare clic su Avanti.

  3. Nella pagina Seleziona un tipo di query lasciare il valore predefinito SELECT che restituisce righe e fare clic su Avanti.

  4. Nella pagina Specifica un'istruzione SQL SELECT lasciare la query predefinita e fare clic su Avanti.

  5. Nella sezione Restituisci un DataTable della pagina Scegliere i metodi per generare digitare GetOrders in Nome metodo.

  6. Fare clic su Fine.

  7. Nel menu Compila scegliere Compila soluzione.

Aggiungere un riferimento all'entità dati e ai livelli di accesso ai dati al servizio dati

Dal momento che il servizio dati richiede le informazioni dal dataset e dagli oggetti TableAdapter, è necessario aggiungere riferimenti ai progetti DataEntityTier e DataAccessTier.

Per aggiungere riferimenti al servizio dati

  1. In Esplora soluzioni fare clic con il pulsante destro su DataService e scegliere Aggiungi riferimento.

  2. Nella finestra di dialogo Aggiungi riferimento fare clic sulla scheda Progetti.

  3. Selezionare entrambi i progetti DataAccessTier e DataEntityTier.

  4. Fare clic su OK.

Aggiungere funzioni al servizio per chiamare i metodi GetCustomers e GetOrders nel livello di accesso ai dati

Ora che il livello di accesso ai dati contiene i metodi per restituire i dati, creare i metodi nel servizio dati per chiamare i metodi nel livello di accesso ai dati.

Nota

Per i progetti C# è necessario aggiungere un riferimento all'assemby System.Data.DataSetExtensions per eseguire la compilazione del codice seguente.

Per creare le funzioni GetCustomers e GetOrders nel servizio dati

  1. Nel progetto DataService fare doppio clic su IService1.vb o IService1.cs.

  2. Aggiungere il codice seguente sotto il commento Aggiungere qui le operazioni del servizio:

    [OperationContract]
    DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers();
    
    [OperationContract]
    DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
    

    Nota

    Il codice per questa esercitazione è disponibile in C# e Visual Basic. Per cambiare il linguaggio di codice in questa pagina tra C# e Visual Basic, usare lo switcher del linguaggio di codice nella parte superiore della pagina sul lato destro.

  3. Nel progetto DataService fare doppio clic su Service1.vb o Service1.cs.

  4. Aggiungere il codice seguente alla classe Service1:

    public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter
             CustomersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter();
        return CustomersTableAdapter1.GetCustomers();
    }
    public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders()
    {
        DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter
             OrdersTableAdapter1
            = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter();
        return OrdersTableAdapter1.GetOrders();
    }
    
  5. Nel menu Compila scegliere Compila soluzione.

Creare un livello di presentazione per visualizzare i dati dal servizio dati

Ora che la soluzione contiene il servizio dati con metodi, che chiamano nel livello di accesso ai dati, creare un altro progetto che chiama il servizio dati e presentare i dati agli utenti. In questa procedura dettagliata, creare un'applicazione Windows Form; si tratta del livello di presentazione dell'applicazione a più livelli.

Per creare il progetto livello di presentazione

  1. Fare clic con il pulsante destro del mouse sulla soluzione in Esplora soluzioni e scegliere Aggiungi>Nuovo progetto.

  2. Nel riquadro sinistro della finestra di dialogo Nuovo progetto selezionare Desktop di Windows. Nel riquadro centrale selezionare Windows Form'app.

  3. Assegnare al progetto il nome PresentationTier e fare clic su OK.

    Il progetto PresentationTier viene creato e aggiunto alla soluzione NTierWalkthrough.

Impostare il progetto PresentationTier come progetto di avvio

Il progetto PresentationTier verrà impostato come progetto di avvio per la soluzione, perché si tratta dell'applicazione client effettiva che presenta e interagisce con i dati.

Impostazione del nuovo livello del progetto come progetto di avvio

  • In Esplora soluzioni fare clic con il pulsante destro del mouse su PresentationTier e scegliere Imposta come progetto di avvio.

Aggiungere riferimenti al livello presentazione

Per accedere ai metodi nel servizio, l'applicazione client PresentationTier richiede un riferimento al servizio dati. È richiesto inoltre un riferimento al dataset per abilitare la condivisione dei tipi da parte del servizio WCF. Finché non si abilita la condivisione dei tipi tramite il servizio dati, il codice aggiunto alla classe del set di dati parziale non è disponibile per il livello presentazione. Poiché in genere si aggiunge codice, ad esempio il codice di convalida alla riga e alla colonna che modifica gli eventi di una tabella dati, è probabile che si voglia accedere a questo codice dal client.

Per aggiungere un riferimento al livello di presentazione

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse su PresentationTier e scegliere Aggiungi riferimento.

  2. Nella finestra di dialogo Aggiungi riferimento selezionare la scheda Progetti.

  3. Selezionare DataEntityTier e scegliere OK.

Per aggiungere il riferimento a un servizio al livello di presentazione

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse su PresentationTier e scegliere Aggiungi riferimento al servizio.

  2. Nella finestra di dialogo Aggiungi riferimento al servizio selezionare Individua.

  3. Selezionare Service1 e scegliere OK.

    Nota

    Se nel computer corrente sono presenti più servizi, selezionare il servizio creato in precedenza in questa procedura dettagliata (il servizio che contiene i GetCustomers metodi e GetOrders ).

Aggiungere DataGridViews al modulo per visualizzare i dati restituiti dal servizio dati

Dopo l'aggiunta del riferimento a un servizio dati, i dati restituiti dal servizio vengono popolati automaticamente nella finestra Origini dati.

Per aggiungere due DataGridView associati a dati al form

  1. Selezionare il progetto PresentationTier in Esplora soluzioni.

  2. Nella finestra Origini dati, espandere NorthwindDataSet e trovare il nodo Customers.

  3. Trascinare il nodo Customers in Form1.

  4. Nella finestra Origini dati espandere il nodo Customers e trovare il nodo Orders correlato, cioè il nodo Orders annidato nel nodo Customers.

  5. Trascinare il nodo Orders correlato in Form1.

  6. Fare doppio clic su un'area vuota del form per creare un gestore eventi Form1_Load.

  7. Aggiungere il codice seguente al gestore eventi Form1_Load.

    ServiceReference1.Service1Client DataSvc =
        new ServiceReference1.Service1Client();
    northwindDataSet.Customers.Merge(DataSvc.GetCustomers());
    northwindDataSet.Orders.Merge(DataSvc.GetOrders());
    

Aumentare le dimensioni massime dei messaggi consentite dal servizio

Il valore predefinito per maxReceivedMessageSize non è sufficientemente grande da contenere i dati recuperati dalle Customers tabelle e Orders . Nei passaggi seguenti si aumenterà il valore a 6553600. Si modifica il valore nel client, che aggiorna automaticamente il riferimento al servizio.

Nota

La dimensione predefinita più bassa è usata per limitare l'esposizione ad attacchi Denial of Service (DoS). Per ulteriori informazioni, vedere MaxReceivedMessageSize.

Per aumentare il valore di maxReceivedMessageSize

  1. In Esplora soluzioni fare doppio clic sul file app.config nel progetto PresentationTier.

  2. Individuare l'attributo maxReceivedMessageSize e modificare il valore in 6553600. Se la voce non viene visualizzata basicHttpBinding , aggiungere una voce simile all'esempio seguente:

    <system.serviceModel>
     <bindings>
         <basicHttpBinding>
             <binding maxBufferSize="6553600" maxReceivedMessageSize="6553600" />
         </basicHttpBinding>
     </bindings>
    </system.serviceModel>
    

Testare l'applicazione

Eseguire l'applicazione premendo F5. I dati delle Customers tabelle e Orders vengono recuperati dal servizio dati e visualizzati nel modulo.

Passaggi successivi

A seconda dei requisiti dell'applicazione, è possibile eseguire diversi passaggi dopo aver salvato i dati correlati nell'applicazione basata su Windows. È possibile ad esempio apportare i seguenti miglioramenti a questa applicazione:

  • Aggiungere la convalida al dataset.

  • Aggiungere al servizio altri metodi per l'aggiornamento dei dati nel database.