Condividi tramite


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

Annotazioni

La DataSet classe 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 app vengono disconnesse dal database. Le tecnologie sono particolarmente utili per le app che consentono agli utenti di modificare i dati e rendere persistenti le modifiche apportate al database. Sebbene i set di dati siano una tecnologia di successo comprovata, l'approccio consigliato per le nuove applicazioni .NET consiste nell'usare Entity Framework Core. Entity Framework offre un modo più naturale per usare i dati tabulari come modelli a oggetti e dispone di un'interfaccia di programmazione più semplice.

Le applicazioni dati a più livelli sono applicazioni che accedono ai dati e sono separate in più livelli logici o livelli. La separazione dei componenti dell'applicazione in livelli discreti aumenta la gestibilità e la scalabilità dell'applicazione. A tale scopo, è possibile semplificare l'adozione di nuove tecnologie che possono essere applicate a un singolo livello senza dover riprogettare l'intera soluzione. L'architettura a più livelli include un livello 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, ad esempio l'autenticazione e la convalida. Il livello dati include un database relazionale. Le applicazioni a più livelli in genere archiviano 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.

Un modo per separare i vari livelli in un'applicazione a più livelli consiste nel creare progetti discreti per ogni livello che si vuole includere nell'applicazione. I set di dati tipizzato contengono una DataSet Project proprietà che determina i progetti in cui deve essere inserito il set di dati generato e TableAdapter il codice.

Questa procedura dettagliata illustra come separare il set di dati e TableAdapter il codice in progetti di libreria di classi discreti usando Progettazione set di dati. Dopo aver separato il set di dati e il codice TableAdapter, crei un servizio Windows Communication Foundation Services e WCF Data Services in Visual Studio per effettuare chiamate 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 questo walkthrough, eseguire i seguenti passaggi:

  • 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 set di dati tipizzato usando 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) da chiamare 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 da usare come livello di presentazione.

  • Creare controlli Windows Form associati all'origine dati.

  • Scrivere 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 del programma di installazione di Visual Studio e scegliere Modifica (o Altre>Modifica) accanto alla versione di Visual Studio da modificare. Consulta per 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. Nel 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. Esplora oggetti di SQL Server viene installato come parte del carico di lavoro Archiviazione dati ed elaborazione 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 selezionare Nuova query.

      Verrà visualizzata una finestra dell'editor di query.

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

    3. Incolla lo script T-SQL nell'editor di query e poi scegli 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. Esplora oggetti di SQL Server viene installato come parte del carico di lavoro Archiviazione dati ed elaborazione 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 selezionare 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 Connessione al database SQL

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

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

      Verrà visualizzata una finestra dell'editor di query.

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

    5. Incolla lo script T-SQL nell'editor di query e poi scegli 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 consiste nel creare una soluzione e 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). Questo progetto viene usato come livello di entità dati dell'applicazione e si trova in genere nel livello intermedio. Il set di dati crea il set di dati iniziale e separa automaticamente il codice nelle due librerie di classi.

Annotazioni

Assicurarsi di denominare correttamente il progetto e la soluzione prima di fare clic su OK. In questo 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 App Windows Forms (.NET Framework) per C# o Visual Basic. .NET Core, .NET 5 e versioni successive non sono supportati.

  2. Assegnare al progetto il nome DataEntityTier.

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

    Viene creata e aggiunta a Esplora soluzioni una soluzione NTierWalkthrough che contiene il progetto DataEntityTier.

Creare la libreria di classi per contenere i TableAdapters (DataAccessTier)

Il passaggio successivo dopo aver creato il progetto DataEntityTier consiste nel creare un altro progetto di libreria di classi. Questo progetto contiene gli oggetti TableAdapter generati ed è denominato livello di accesso ai dati dell'applicazione. Il livello di accesso ai dati contiene le informazioni necessarie per connettersi al database e si trova in genere 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 nel creare un set di dati tipizzato. I dataset tipizzati vengono creati sia con la classe del dataset (incluso le classi DataTables) sia con le classi TableAdapter in un unico 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.

Annotazioni

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 Choose Your Data Connection (Scegli connessione dati ) eseguire una delle azioni seguenti:

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

    o

    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.

    Annotazioni

    Se è stato selezionato un file di database locale invece di connettersi a SQL Server, potrebbe essere richiesto se si vuole 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 Scegliere gli 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 aver creato il set di dati, separare la classe del set di dati generato dagli oggetti TableAdapters. A tale scopo, impostare la proprietà DataSet Project sul nome del progetto in cui archiviare la classe del set di dati separata.

Per separare gli oggetti TableAdapter dal set di dati

  1. Fare doppio clic su NorthwindDataSet.xsd in Esplora soluzioni per aprire il set di dati in Progettazione set di dati.

  2. Selezionare un'area vuota nel designer.

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

  4. Nell'elenco Progetto DataSet selezionare DataEntityTier.

  5. Scegliere Compila soluzione dal menu Compila.

    Il set di dati 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).

Annotazioni

Quando si separano set di dati e tableAdapter (impostando la proprietà Progetto DataSet ), le classi di set di dati parziali esistenti nel progetto non verranno spostate automaticamente. Le classi parziali del set di dati esistenti devono essere spostate manualmente nel progetto del set di dati.

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 metodi GetCustomers e GetOrders nel progetto DataAccessTier.

Per creare un metodo nel livello di accesso ai dati che restituisce 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 Choose a Command Type (Scegli un tipo di comando) lasciare il valore predefinito Use SQL statements (Usa istruzioni SQL ) e fare clic su Next (Avanti).

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

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

  6. Nella pagina Choose Methods to Generate (Scegli metodi da generare ) digitare GetCustomers come Nome metodo nella sezione Restituisci una tabella dati .

  7. Fare clic su Fine.

Per creare un metodo nel livello di accesso ai dati che restituisce la tabella Orders

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

  2. Nella pagina Choose a Command Type (Scegli un tipo di comando) lasciare il valore predefinito Use SQL statements (Usa istruzioni SQL ) e fare clic su Next (Avanti).

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

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

  5. Nella pagina Choose Methods to Generate (Scegli metodi da generare) digitare GetOrders come Nome metodo nella sezione Restituisci una tabella dati .

  6. Fare clic su Fine.

  7. Nel menu Compila scegliere Compila soluzione.

Aggiungi un riferimento all'entità dati e ai livelli di accesso ai dati all'interno del servizio dati

Poiché il servizio dati richiede informazioni dal set di dati e dagli oggetti TableAdapter, aggiungere riferimenti ai progetti DataEntityTier e DataAccessTier .

Per aggiungere riferimenti al servizio dati

  1. Fare clic con il pulsante destro del mouse su DataService in Esplora soluzioni e scegliere Aggiungi riferimento.

  2. Fare clic sulla scheda Progetti nella finestra di dialogo Aggiungi riferimento .

  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 metodi nel servizio dati per chiamare i metodi nel livello di accesso ai dati.

Annotazioni

Per i progetti C#, è necessario aggiungere un riferimento all'assembly System.Data.DataSetExtensions per il codice seguente da compilare.

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 le operazioni del servizio qui :

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

    Annotazioni

    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 all'interno del livello di accesso ai dati, crea un altro progetto che chiama il servizio dati e presenta i dati agli utenti. Per questa procedura dettagliata, crea un'applicazione Windows Forms; si tratta del livello di presentazione dell'applicazione a più livelli.

Per creare il progetto del 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 App Windows Form.

  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.

Per impostare il nuovo progetto del livello presentazione 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 di presentazione

L'applicazione client PresentationTier richiede un riferimento al servizio dati per accedere ai metodi nel servizio. Inoltre, è necessario un riferimento al set di dati per abilitare la condivisione dei tipi dal 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 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 un riferimento al servizio al layer 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, selezionate Individua.

  3. Selezionare Service1 e scegliere OK.

    Annotazioni

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

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

Dopo aver aggiunto il riferimento al servizio dati, la finestra Origini dati viene popolata automaticamente con i dati restituiti dal servizio.

Per aggiungere due oggetti DataGridView associati a dati al modulo

  1. In Esplora soluzioni selezionare il progetto PresentationTier .

  2. Nella finestra Origini dati espandere NorthwindDataSet e individuare il nodo Clienti .

  3. Trascinare il nodo Customers in Form1.

  4. Nella finestra Origini dati espandere il nodo Clienti e individuare il nodo Ordini correlato (il nodo Ordini annidato nel nodo Clienti ).

  5. Trascinare il nodo Orders correlato in Form1.

  6. Creare un Form1_Load gestore eventi facendo doppio clic su un'area vuota del modulo.

  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.

Annotazioni

Le dimensioni predefinite inferiori sono destinate a limitare l'esposizione agli attacchi Denial of Service (DoS). Per altre informazioni, vedere MaxReceivedMessageSize.

Per aumentare il valore 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 non vedi la voce basicHttpBinding, aggiungine una come nell'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. Ad esempio, è possibile apportare i miglioramenti seguenti all'applicazione:

  • Aggiungere la convalida al set di dati.

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