Dela via


Genomgång: Skapa ett n-nivådataprogram med ADO.NET och .NET Framework

Anmärkning

Klassen DataSet och relaterade klasser är äldre .NET Framework-tekniker från början av 2000-talet som gör det möjligt för program att arbeta med data i minnet medan apparna kopplas från databasen. Teknikerna är särskilt användbara för appar som gör det möjligt för användare att ändra data och spara ändringarna tillbaka till databasen. Även om datauppsättningar är en bevisad framgångsrik teknik är den rekommenderade metoden för nya .NET-program att använda Entity Framework Core. Entity Framework är ett mer naturligt sätt att arbeta med tabelldata som objektmodeller och har ett enklare programmeringsgränssnitt.

N-nivådataprogram är program som har åtkomst till data och är uppdelade i flera logiska lager eller nivåer. Om du separerar programkomponenter på diskreta nivåer ökar programmets underhållbarhet och skalbarhet. Det gör det genom att underlätta införandet av ny teknik som kan tillämpas på en enda nivå utan att du behöver göra om hela lösningen. N-nivåarkitektur innehåller en presentationsnivå, en mellannivå och en datanivå. Mellannivån innehåller vanligtvis ett dataåtkomstlager, ett affärslogiklager och delade komponenter som autentisering och validering. Datanivån innehåller en relationsdatabas. N-nivåprogram lagrar vanligtvis känslig information i dataåtkomstlagret på mellannivån för att upprätthålla isolering från slutanvändare som har åtkomst till presentationsnivån. Mer information finns i Översikt över N-nivådataprogram.

Ett sätt att separera de olika nivåerna i ett n-nivåprogram är att skapa diskreta projekt för varje nivå som du vill inkludera i ditt program. Inskrivna datauppsättningar innehåller en DataSet Project egenskap som avgör vilka projekt som den genererade datamängden och TableAdapter koden ska gå till.

Den här genomgången visar hur du separerar datamängd och TableAdapter kod i diskreta klassbiblioteksprojekt med hjälp av Datauppsättningsdesignern. När du har separerat datauppsättningen och TableAdapter-koden skapar du en Windows Communication Foundation Services och WCF Data Services i Visual Studio-tjänsten för att anropa till dataåtkomstnivån. Slutligen skapar du ett Windows Forms-program som presentationsnivå. Den här nivån kommer åt data från datatjänsten.

Under den här genomgången utför du följande steg:

  • Skapa en ny n-nivålösning som innehåller flera projekt.

  • Lägg till två klassbiblioteksprojekt i n-nivålösningen.

  • Skapa en typad datauppsättning med hjälp av konfigurationsguiden för datakälla.

  • Avgränsa de genererade TableAdapters och datauppsättningskoden i diskreta projekt.

  • Skapa en WCF-tjänst (Windows Communication Foundation) för att anropa till dataåtkomstnivån.

  • Skapa funktioner i tjänsten för att hämta data från dataåtkomstnivån.

  • Skapa ett Windows Forms-program som ska fungera som presentationsnivå.

  • Skapa Windows Forms-kontroller som är bundna till datakällan.

  • Skriv kod för att fylla i datatabellerna.

Förutsättningar

För att slutföra den här självstudien behöver du .NET-skrivbordsutveckling och datalagring och bearbetning arbetsuppgifter installerade i Visual Studio. Om du vill installera dem öppnar du Visual Studio Installer och väljer Ändra (eller Mer>Ändra) bredvid den version av Visual Studio som du vill ändra. Se Ändrai Visual Studio.

Den här genomgången använder SQL Server Express LocalDB och Northwind-exempeldatabasen.

  1. Om du inte har SQL Server Express LocalDB installerar du det antingen från nedladdningssidan för SQL Server Express eller via Visual Studio Installer. I Visual Studio Installer kan du installera SQL Server Express LocalDB som en del av arbetsbelastningen för .NET-skrivbordsutveckling eller som en enskild komponent.

  2. Installera Northwind-exempeldatabasen genom att följa dessa steg:

    1. Öppna fönstret SQL Server Object Explorer i Visual Studio. (SQL Server Object Explorer installeras som en del av datalagrings- och bearbetningsarbetsbelastningen i Visual Studio Installer.) Expandera SQL Server-noden . Högerklicka på din LocalDB-instans och välj Ny fråga.

      Ett frågeredigerarefönster öppnas.

    2. Kopiera Northwind-Transact-SQL-skriptet till urklipp. Det här T-SQL-skriptet skapar Northwind-databasen från grunden och fyller den med data.

    3. Klistra in T-SQL-skriptet i frågeredigeraren och välj sedan knappen Kör.

      Efter en kort tid slutförs frågan och Northwind-databasen skapas.

    1. Öppna fönstret SQL Server Object Explorer i Visual Studio. (SQL Server Object Explorer installeras som en del av datalagrings- och bearbetningsarbetsbelastningen i Visual Studio Installer.) Expandera SQL Server-noden . Högerklicka på din LocalDB-instans och välj Ny fråga.

      Om du inte ser LocalDB-instansen använder du verktygsfältsknappen Lägg till SQL Server. Dialogrutan visas. I dialogrutan expanderar du Lokalt och väljer MSSQLLocalDB. Ange lämpliga autentiseringsuppgifter. Du kan lämna standardalternativet för databasen.

      Skärmbild av dialogrutan Anslut till SQL Database

    2. Välj Anslut. En nod läggs till för LocalDB i SQL Server Object Explorer.

    3. Högerklicka på din LocalDB-instans och välj Ny fråga.

      Ett frågeredigerarefönster öppnas.

    4. Kopiera Northwind-Transact-SQL-skriptet till urklipp. Det här T-SQL-skriptet skapar Northwind-databasen från grunden och fyller den med data.

    5. Klistra in T-SQL-skriptet i frågeredigeraren och välj sedan knappen Kör.

      Efter en kort tid slutförs frågan och Northwind-databasen skapas.

Skapa n-nivålösningen och klassbiblioteket för att lagra datamängden (DataEntityTier)

Det första steget i den här genomgången är att skapa en lösning och två klassbiblioteksprojekt. Det första klassbiblioteket innehåller datamängden (den genererade typtypen DataSet och DataTables som innehåller programmets data). Det här projektet används som dataentitetslagret i programmet och finns vanligtvis på mellannivån. Datauppsättningen skapar den första datauppsättningen och separerar automatiskt koden i de två klassbiblioteken.

Anmärkning

Se till att namnge projektet och lösningen korrekt innan du klickar på OK. Om du gör det blir det enklare för dig att slutföra den här genomgången.

Så här skapar du n-nivålösningen och DataEntityTier-klassbiblioteket

  1. Skapa ett projekt i Visual Studio med hjälp av projektmallen Windows Forms App (.NET Framework) för C# eller Visual Basic. .NET Core, .NET 5 och senare stöds inte.

  2. Ge projektet namnet DataEntityTier.

  3. Ge lösningen namnet NTierWalkthrough och välj sedan OK.

    En NTierWalkthrough-lösning som innehåller Projektet DataEntityTier skapas och läggs till i Solution Explorer.

Skapa klassbiblioteket för att lagra TableAdapters (DataAccessTier)

Nästa steg när du har skapat Projektet DataEntityTier är att skapa ett annat klassbiblioteksprojekt. Det här projektet innehåller de genererade TableAdapters och kallas för programmets dataåtkomstnivå . Dataåtkomstnivån innehåller den information som krävs för att ansluta till databasen och som vanligtvis finns på mellannivån.

Skapa ett separat klassbibliotek för TableAdapters

  1. Högerklicka på lösningen i Solution Explorer och välj Lägg till>nytt projekt.

  2. Välj projektmallen Klassbibliotek (.NET Framework).

  3. Ge projektet namnet DataAccessTier och välj OK.

    DataAccessTier-projektet skapas och läggs till i NTierWalkthrough-lösningen.

Skapa datauppsättningen

Nästa steg är att skapa en typad datauppsättning. Typade datauppsättningar skapas med både datasetklassen (inklusive DataTables klasser) och klasserna TableAdapter i ett enda projekt. (Alla klasser genereras till en enda fil.) När du separerar datamängden och TableAdapters i olika projekt är det datamängdsklassen som flyttas till det andra projektet och lämnar klasserna TableAdapter i det ursprungliga projektet. Skapa därför datauppsättningen i projektet som slutligen kommer att innehålla TableAdapters (DataAccessTier-projektet). Du skapar datauppsättningen med hjälp av konfigurationsguiden för datakälla.

Anmärkning

Du måste ha åtkomst till Northwind-exempeldatabasen för att kunna skapa anslutningen. Information om hur du konfigurerar Northwind-exempeldatabasen finns i Så här installerar du exempeldatabaser.

Så här skapar du datauppsättningen

  1. Välj DataAccessTier i Solution Explorer.

  2. På menyn Data väljer du Visa datakällor.

    Fönstret Datakällor öppnas.

  3. I fönstret Datakällor väljer du Lägg till ny datakälla för att starta konfigurationsguiden för datakälla.

  4. På sidan Välj datakällatyp väljer du Databas och sedan Nästa.

  5. På sidan Välj dataanslutning utför du någon av följande åtgärder:

    Om det finns en dataanslutning till Northwind-exempeldatabasen i listrutan väljer du den.

    eller

    Välj Ny anslutning för att öppna dialogrutan Lägg till anslutning .

  6. Om databasen kräver ett lösenord väljer du alternativet för att inkludera känsliga data och väljer sedan Nästa.

    Anmärkning

    Om du har valt en lokal databasfil (i stället för att ansluta till SQL Server) kan du tillfrågas om du vill lägga till filen i projektet. Välj Ja för att lägga till databasfilen i projektet.

  7. Välj Nästa på sidan Spara anslutningssträngen på sidan Programkonfigurationsfil .

  8. Expandera noden Tabeller på sidan Välj databasobjekt .

  9. Markera kryssrutorna för tabellerna Kunder och Beställningar och välj sedan Slutför.

    NorthwindDataSet läggs till i DataAccessTier-projektet och visas i fönstret Datakällor .

Avgränsa TableAdapters från datauppsättningen

När du har skapat datauppsättningen separerar du den genererade datamängdsklassen från TableAdapters. Det gör du genom att ange egenskapen DataSet Project till namnet på projektet där den avgränsade datamängdsklassen ska lagras.

Så här separerar du TableAdapters från datauppsättningen

  1. Dubbelklicka på NorthwindDataSet.xsd i Solution Explorer för att öppna datauppsättningen i Datauppsättningsdesignern.

  2. Välj ett tomt område i designern.

  3. Leta upp noden DataSet Project i fönstret Egenskaper .

  4. I listan DataSet-projekt väljer du DataEntityTier.

  5. På menyn Build väljer du Build Solution.

    Datauppsättningen och TableAdapters är uppdelade i de två klassbiblioteksprojekten. Projektet som ursprungligen innehöll hela datamängden (DataAccessTier) innehåller nu endast TableAdapters. Projektet som anges i egenskapen DataSet Project (DataEntityTier) innehåller den typerade datauppsättningen: NorthwindDataSet.Dataset.Designer.vb (eller NorthwindDataSet.Dataset.Designer.cs).

Anmärkning

När du separerar datauppsättningar och TableAdapters (genom att ange egenskapen DataSet Project ) flyttas inte befintliga partiella datamängdsklasser i projektet automatiskt. Befintliga partiella datamängdsklasser måste flyttas manuellt till datamängdsprojektet.

Skapa ett nytt tjänstprogram

Den här genomgången visar hur du kommer åt dataåtkomstnivån med hjälp av en WCF-tjänst, så vi skapar ett nytt WCF-tjänstprogram.

Så här skapar du ett nytt WCF-tjänstprogram

  1. Högerklicka på lösningen i Solution Explorer och välj Lägg till>nytt projekt.

  2. I dialogrutan Nytt projekt går du till den vänstra rutan och väljer WCF. I den mellersta rutan väljer du WCF-tjänstbibliotek.

  3. Ge projektet namnet DataService och välj OK.

    DataService-projektet skapas och läggs till i NTierWalkthrough-lösningen.

Skapa metoder på dataåtkomstnivån för att returnera kunder och orderdata

Datatjänsten måste anropa två metoder på dataåtkomstnivån: GetCustomers och GetOrders. Dessa metoder returnerar Northwind Customers och Orders tabeller. Skapa GetCustomers och GetOrders metoderna i projektet DataAccessTier.

Så här skapar du en metod på dataåtkomstnivån som returnerar tabellen Kunder

  1. Dubbelklicka på NorthwindDataset.xsd i Solution Explorer för att öppna datauppsättningen.

  2. Högerklicka på CustomersTableAdapter och klicka på Lägg till fråga.

  3. På sidan Välj en kommandotyp lämnar du standardvärdet Använd SQL-instruktioner och klickar på Nästa.

  4. På sidan Välj frågetyp lämnar du standardvärdet SELECT som returnerar rader och klickar på Nästa.

  5. På sidan Ange en SQL SELECT-instruktion lämnar du standardfrågan och klickar på Nästa.

  6. På sidan Välj metoder att generera skriver du GetCustomers som metodnamn i avsnittet Return a DataTable (Returnera en datatabell ).

  7. Klicka på Finish.

Så här skapar du en metod på dataåtkomstnivån som returnerar tabellen Beställningar

  1. Högerklicka på OrdersTableAdapter och klicka på Lägg till fråga.

  2. På sidan Välj en kommandotyp lämnar du standardvärdet Använd SQL-instruktioner och klickar på Nästa.

  3. På sidan Välj frågetyp lämnar du standardvärdet SELECT som returnerar rader och klickar på Nästa.

  4. På sidan Ange en SQL SELECT-instruktion lämnar du standardfrågan och klickar på Nästa.

  5. På sidan Välj metoder att generera skriver du GetOrders som metodnamn i avsnittet Return a DataTable (Returnera en datatabell ).

  6. Klicka på Finish.

  7. Klicka på Skapa lösningSkapa-menyn.

Lägga till en referens till dataentitets- och dataåtkomstnivåerna till datatjänsten

Eftersom datatjänsten kräver information från datauppsättningen och TableAdapters lägger du till referenser till projekten DataEntityTier och DataAccessTier .

Så här lägger du till referenser till datatjänsten

  1. Högerklicka på DataService i Solution Explorer och klicka på Lägg till referens.

  2. Klicka på fliken Projekt i dialogrutan Lägg till referens .

  3. Välj både DataAccessTier och DataEntityTier projekten.

  4. Klicka på OK.

Lägg till funktioner i tjänsten för att anropa metoderna GetCustomers och GetOrders på dataåtkomstnivån

Nu när dataåtkomstnivån innehåller metoderna för att returnera data skapar du metoder i datatjänsten för att anropa metoderna på dataåtkomstnivån.

Anmärkning

För C#-projekt måste du lägga till en referens till System.Data.DataSetExtensions sammansättningen för följande kod som ska kompileras.

Skapa funktionerna GetCustomers och GetOrders i datatjänsten

  1. Dubbelklicka på IService1.vb eller IService1.cs i DataService-projektet.

  2. Lägg till följande kod under kommentaren Lägg till tjänståtgärder här :

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

    Anmärkning

    Koden för den här handledningen finns i C# och Visual Basic. Om du vill växla kodspråket på den här sidan mellan C# och Visual Basic använder du kodspråksväxlaren överst på sidan till höger.

  3. Dubbelklicka på Service1.vb (eller Service1.cs) i DataService-projektet.

  4. Lägg till följande kod i klassen 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. Klicka på Skapa lösningSkapa-menyn.

Skapa en presentationsnivå för att visa data från datatjänsten

Nu när lösningen innehåller den datatjänst som har metoder, som anropar till dataåtkomstnivån, skapar du ett annat projekt som anropar datatjänsten och presenterar data för användarna. I den här genomgången skapar du ett Windows Forms-program. det här är presentationsnivån för n-nivåprogrammet.

Så här skapar du projektet på presentationsnivå

  1. Högerklicka på lösningen i Solution Explorer och välj Lägg till>nytt projekt.

  2. I dialogrutan Nytt projekt går du till den vänstra rutan och väljer Windows Desktop. I den mellersta rutan väljer du Windows Forms App.

  3. Ge projektet namnet PresentationTier och klicka på OK.

    Projektet PresentationTier skapas och läggs till i NTierWalkthrough-lösningen.

Ange PresentationTier-projektet som startprojekt

Vi ställer in Projektet PresentationTier som startprojekt för lösningen eftersom det är det faktiska klientprogrammet som presenterar och interagerar med data.

Så här anger du det nya presentationsnivåprojektet som startprojekt

  • Högerklicka på PresentationTier i Solution Explorer och klicka på Ange som startprojekt.

Lägga till referenser till presentationsnivån

Klientprogrammet PresentationTier kräver en tjänstreferens till datatjänsten för att få åtkomst till metoderna i tjänsten. Dessutom krävs en referens till datamängden för att aktivera typdelning av WCF-tjänsten. Tills du aktiverar typdelning via datatjänsten är kod som lagts till i den partiella datamängdsklassen inte tillgänglig för presentationsnivån. Eftersom du vanligtvis lägger till kod, till exempel verifieringskod till rad- och kolumnändringshändelser i en datatabell, är det troligt att du vill komma åt den här koden från klienten.

Så här lägger du till en referens till presentationsnivån

  1. Högerklicka på PresentationTier i Solution Explorer och välj Lägg till referens.

  2. I dialogrutan Lägg till referens väljer du fliken Projekt .

  3. Välj DataEntityTier och välj OK.

Så här lägger du till en tjänstreferens till presentationsnivån

  1. Högerklicka på PresentationTier i Solution Explorer och välj Lägg till tjänstreferens.

  2. I dialogrutan Lägg till tjänstreferens väljer du Identifiera.

  3. Välj Service1 och välj OK.

    Anmärkning

    Om du har flera tjänster på den aktuella datorn väljer du den tjänst som du skapade tidigare i den här genomgången (den tjänst som innehåller GetCustomers metoderna och GetOrders ).

Lägg till DataGridViews i formuläret för att visa data som returneras av datatjänsten

När du har lagt till tjänstreferensen till datatjänsten fylls fönstret Datakällor automatiskt i med de data som returneras av tjänsten.

Så här lägger du till två databundna DataGridViews i formuläret

  1. I Solution Explorer väljer du projektet PresentationTier .

  2. I fönstret Datakällor expanderar du NorthwindDataSet och letar upp noden Kunder .

  3. Dra noden Kunder till Formulär1.

  4. I fönstret Datakällor expanderar du noden Kunder och letar upp noden Relaterade beställningar (noden Beställningar kapslade i noden Kunder ).

  5. Dra noden Relaterade beställningar till Formulär1.

  6. Skapa en Form1_Load händelsehanterare genom att dubbelklicka på ett tomt område i formuläret.

  7. Lägg till följande kod i händelsehanteraren för Form1_Load.

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

Öka den maximala meddelandestorleken som tillåts av tjänsten

Standardvärdet för är inte tillräckligt stort för maxReceivedMessageSize att lagra data som hämtats från tabellerna Customers och Orders . I följande steg ökar du värdet till 6553600. Du ändrar värdet på klienten, vilket automatiskt uppdaterar tjänstreferensen.

Anmärkning

Den lägre standardstorleken är avsedd att begränsa exponeringen för DoS-attacker (Denial of Service). Mer information finns i MaxReceivedMessageSize.

Öka maxReceivedMessageSize-värdet

  1. Dubbelklicka på filenapp.config i Projektet PresentationTier i Solution Explorer.

  2. Leta upp attributet maxReceivedMessageSize och ändra värdet till 6553600. Om du inte ser posten basicHttpBinding lägger du till en som i följande exempel:

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

Testa programmet

Kör programmet genom att trycka på F5. Data från tabellerna Customers och Orders hämtas från datatjänsten och visas i formuläret.

Nästa steg

Beroende på dina programkrav finns det flera steg som du kanske vill utföra när du har sparat relaterade data i det Windows-baserade programmet. Du kan till exempel göra följande förbättringar av det här programmet:

  • Lägg till validering i datauppsättningen.

  • Lägg till ytterligare metoder i tjänsten för att uppdatera data tillbaka till databasen.