Delen via


Werken met berekende kolommen (C#)

door Scott Mitchell

PDF downloaden

Wanneer u een databasetabel maakt, kunt u met Microsoft SQL Server een berekende kolom definiëren waarvan de waarde wordt berekend op basis van een expressie die meestal verwijst naar andere waarden in dezelfde databaserecord. Dergelijke waarden zijn alleen voor lezen in de database, waarvoor speciale overwegingen nodig zijn wanneer u met TableAdapters werkt. In deze zelfstudie leert u hoe u kunt voldoen aan de uitdagingen die worden gesteld door berekende kolommen.

Introductie

Met Microsoft SQL Server kunnen berekende kolommen worden berekend. Dit zijn kolommen waarvan de waarden worden berekend op basis van een expressie die meestal verwijst naar de waarden uit andere kolommen in dezelfde tabel. Een gegevensmodel voor het bijhouden van tijd kan bijvoorbeeld een tabel hebben die ServiceLog heet, met kolommen zoals ServicePerformed, EmployeeID, Rate en Duration, onder andere. Hoewel het verschuldigde bedrag per service-item (het tarief vermenigvuldigd met de duur) kan worden berekend via een webpagina of een andere programmatische interface, kan het handig zijn om een kolom op te nemen in de ServiceLog tabel met de naam AmountDue die deze informatie heeft gerapporteerd. Deze kolom kan worden gemaakt als een normale kolom, maar moet worden bijgewerkt wanneer de Rate waarden of Duration kolomwaarden worden gewijzigd. Een betere benadering is om de AmountDue kolom een berekende kolom te maken met behulp van de expressie Rate * Duration. Als u dit doet, wordt de AmountDue kolomwaarde automatisch door SQL Server berekend wanneer ernaar wordt verwezen in een query.

Omdat een berekende kolomwaarde wordt bepaald door een uitdrukking, zijn dergelijke kolommen alleen-lezen en kunnen daarom geen waarden aan deze kolommen worden toegewezen in INSERT of UPDATE instructies. Wanneer berekende kolommen echter deel uitmaken van de hoofdquery voor een TableAdapter die gebruikmaakt van ad-hoc SQL-instructies, worden deze automatisch opgenomen in de automatisch gegenereerde INSERT en UPDATE instructies. Daarom moeten de INSERT en UPDATE query's en de InsertCommand en UpdateCommand eigenschappen van de TableAdapters worden bijgewerkt om verwijzingen naar berekende kolommen te verwijderen.

Een uitdaging bij het gebruik van berekende kolommen met een TableAdapter die gebruikmaakt van ad-hoc SQL-instructies, is dat de INSERT- en UPDATE-query's van de TableAdapter automatisch opnieuw worden gegenereerd telkens wanneer de configuratiewizard van de TableAdapter wordt voltooid. Daarom zullen de handmatig verwijderde berekende kolommen uit de INSERT en UPDATE query's opnieuw verschijnen als de wizard opnieuw wordt uitgevoerd. Hoewel TableAdapters die gebruikmaken van opgeslagen procedures geen last hebben van deze broosheid, hebben ze wel hun eigen eigenaardigheden die we in stap 3 zullen aanpakken.

In deze zelfstudie voegen we een berekende kolom toe aan de Suppliers tabel in de Northwind-database en maken we vervolgens een bijbehorende TableAdapter om met deze tabel en de berekende kolom te werken. We gebruiken onze TableAdapter opgeslagen procedures in plaats van ad-hoc SQL-instructies, zodat onze aanpassingen niet verloren gaan wanneer de wizard TableAdapter-configuratie wordt gebruikt.

Laten we beginnen!

Stap 1: Een berekende kolom toevoegen aan deSupplierstabel

De Northwind-database heeft geen berekende kolommen, dus we moeten er zelf een toevoegen. Voor deze zelfstudie voegen we een berekende kolom toe aan de Suppliers tabel, genaamd FullContactName, die de naam, titel en het bedrijf van de contactpersoon retourneert in de volgende indeling: ContactName (ContactTitle, CompanyName). Deze berekende kolom kan worden gebruikt in rapporten bij het weergeven van informatie over leveranciers.

Open eerst de tabeldefinitie door met de Suppliers rechtermuisknop op de Suppliers tabel in Server Explorer te klikken en Open Table Definition te kiezen in het contextmenu. Hiermee worden de kolommen van de tabel en de bijbehorende eigenschappen weergegeven, zoals het gegevenstype, of ze dat toestaan NULL , enzovoort. Als u een berekende kolom wilt toevoegen, typt u eerst de naam van de kolom in de tabeldefinitie. Voer vervolgens de expressie in het tekstvak (Formule) in onder de sectie Berekende kolomspecificatie in het venster Kolomeigenschappen (zie afbeelding 1). Geef de berekende kolom FullContactName een naam en gebruik de volgende expressie:

ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN 
    ContactTitle + ', ' ELSE '' END + CompanyName + ')'

Houd er rekening mee dat tekenreeksen kunnen worden samengevoegd in SQL met behulp van de + operator. De CASE instructie kan worden gebruikt als een voorwaarde in een traditionele programmeertaal. In de bovenstaande expressie kan de CASE instructie worden gelezen als: Als ContactTitle niet NULL is, dan de ContactTitle waarde samenvoegen met een komma, anders geen uitvoer geven. Zie CASEvoor meer informatie over de bruikbaarheid van de CASE instructie.

Opmerking

In plaats van hier een CASE instructie te gebruiken, zouden we ook ISNULL(ContactTitle, '') kunnen gebruiken als alternatief. ISNULL(checkExpression, replacementValue) retourneert checkExpression als deze niet NULL is, anders retourneert het vervangingswaarde. Hoewel of ISNULL of CASE in dit geval werkt, zijn er complexere scenario's waarbij de flexibiliteit van de CASE instructie niet kan worden geëvenaard door ISNULL.

Nadat u deze berekende kolom hebt toegevoegd, ziet het scherm eruit als de schermafbeelding in afbeelding 1.

Een berekende kolom met de naam FullContactName toevoegen aan de tabel Leveranciers

Afbeelding 1: Een berekende kolom met de naam FullContactName toevoegen aan de Suppliers tabel (klik om de afbeelding op volledige grootte weer te geven)

Nadat u de berekende kolom een naam hebt geven en de expressie hebt ingevoerd, slaat u de wijzigingen in de tabel op door op het pictogram Opslaan in de werkbalk te klikken, op Ctrl+S te drukken of door naar het menu Bestand te gaan en Opslaan Supplierste kiezen.

Als u de tabel opslaat, moet de Server Explorer worden vernieuwd, waarbij de zojuist toegevoegde kolom in de kolomlijst van de Suppliers-tabel wordt opgenomen. Bovendien wordt de expressie die is ingevoerd in het tekstvak (Formule) automatisch aangepast aan een equivalente expressie waarmee onnodige witruimte wordt verwijderd, kolomnamen tussen vierkante haken ([]) worden geplaatst en haakjes worden opgenomen om de volgorde van bewerkingen expliciet weer te geven:

(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL 
    then [ContactTitle]+', ' else '' end)+[CompanyName])+')')

Raadpleeg de technische documentatie voor meer informatie over berekende kolommen in Microsoft SQL Server. Bekijk ook het artikel Procedure: Berekende kolommen opgeven voor een stapsgewijze procedure voor het maken van berekende kolommen.

Opmerking

Berekende kolommen worden standaard niet fysiek opgeslagen in de tabel, maar worden in plaats daarvan telkens opnieuw berekend wanneer ernaar wordt verwezen in een query. Door het selectievakje Blijft behouden in te schakelen, kunt u SQL Server echter instrueren om de berekende kolom fysiek op te slaan in de tabel. Hierdoor kan een index worden gemaakt in de berekende kolom, waardoor de prestaties van query's die gebruikmaken van de berekende kolomwaarde in hun WHERE componenten, worden verbeterd. Zie Indexen maken voor berekende kolommen voor meer informatie.

Stap 2: de waarden van de berekende kolom weergeven

Voordat we aan de data access-laag gaan werken, nemen we even de tijd om de FullContactName waarden weer te geven. Klik in Server Explorer met de rechtermuisknop op de Suppliers tabelnaam en kies Nieuwe query in het contextmenu. Hiermee wordt een queryvenster weergegeven waarin wordt gevraagd om te kiezen welke tabellen in de query moeten worden opgenomen. Voeg de Suppliers tabel toe en klik op Sluiten. Controleer vervolgens de kolommen CompanyName, ContactName, ContactTitle en FullContactName van de tabel Leveranciers. Klik ten slotte op het rode uitroepteken in de werkbalk om de query uit te voeren en de resultaten weer te geven.

Zoals in afbeelding 2 wordt weergegeven, bevatten de resultaten FullContactName, waarin de CompanyName, ContactName en ContactTitle kolommen worden vermeld met de notatie ldquo;ContactName (ContactTitle, CompanyName) .

FullContactName maakt gebruik van de notatie ContactName (ContactTitle, CompanyName)

Afbeelding 2: De FullContactNameContactName indeling (ContactTitle, CompanyName) gebruiken (klik om de afbeelding op volledige grootte weer te geven)

Stap 3: deSuppliersTableAdaptergegevenstoegangslaag toevoegen

Om met de leveranciersinformatie in onze toepassing te kunnen werken, moeten we eerst een TableAdapter en DataTable maken in onze DAL. Idealiter zou dit worden bereikt met behulp van dezelfde eenvoudige stappen die in eerdere zelfstudies worden onderzocht. Het werken met berekende kolommen introduceert echter enkele rimpels die discussie verdienen.

Als u een TableAdapter gebruikt die gebruikmaakt van ad-hoc SQL-instructies, kunt u de berekende kolom in de hoofdquery van TableAdapter opnemen via de wizard TableAdapter-configuratie. Deze, echter, zullen automatisch gegenereerd worden als INSERT en UPDATE commando's die de berekende kolom bevatten. Als u een van deze methoden probeert uit te voeren, kan een SqlException met het bericht ColumnName niet worden gewijzigd omdat het een berekende kolom is of het resultaat is van een UNION-operator. Hoewel de INSERT en UPDATE instructie handmatig kunnen worden aangepast via de eigenschappen InsertCommand en UpdateCommand van de TableAdapter, gaan deze aanpassingen verloren wanneer de TableAdapter-configuratiewizard opnieuw wordt uitgevoerd.

Vanwege de broosheid van TableAdapters die ad-hoc SQL-instructies gebruiken, is het raadzaam om opgeslagen procedures te gebruiken bij het werken met berekende kolommen. Als u bestaande opgeslagen procedures gebruikt, configureert u de TableAdapter zoals beschreven in de handleiding Gebruik van bestaande opgeslagen procedures voor de TableAdapters van getypte DataSets. Als u de wizard TableAdapter de opgeslagen procedures voor u laat maken, is het echter belangrijk om aanvankelijk alle berekende kolommen uit de hoofdquery weg te laten. Als u een berekende kolom in de hoofdquery opneemt, informeert de wizard TableAdapter-configuratie u na voltooiing dat de bijbehorende opgeslagen procedures niet kunnen worden gemaakt. Kortom, we moeten de TableAdapter in eerste instantie configureren met behulp van een berekende hoofdquery zonder kolommen en vervolgens de bijbehorende opgeslagen procedure en de TableAdapter s SelectCommand handmatig bijwerken om de berekende kolom op te nemen. Deze benadering is vergelijkbaar met de methode die wordt gebruikt in de tutorial over het bijwerken van de TableAdapter om te gebruikenJOIN.

Voor deze zelfstudie gaan we een nieuwe TableAdapter toevoegen en automatisch de opgeslagen procedures voor ons maken. Daarom moeten we de FullContactName berekende kolom in eerste instantie weglaten uit de hoofdquery.

Open eerst de NorthwindWithSprocs DataSet in de ~/App_Code/DAL map. Klik met de rechtermuisknop in de ontwerpfunctie en kies in het contextmenu om een nieuwe TableAdapter toe te voegen. Hiermee wordt de wizard TableAdapter-configuratie gestart. Geef de database op waaruit u gegevens wilt opvragen uit (NORTHWNDConnectionString van Web.config) en klik op Volgende. Omdat we nog geen opgeslagen procedures voor het uitvoeren van query's of het wijzigen van de Suppliers tabel hebben gemaakt, selecteert u de optie Nieuwe opgeslagen procedures maken, zodat de wizard deze voor ons maakt en op Volgende klikt.

Kies de optie Nieuwe opgeslagen procedures maken

Afbeelding 3: Kies de optie Nieuwe opgeslagen procedures maken (klik hier om de volledige afbeelding weer te geven)

De volgende stap vraagt ons om de belangrijkste vraag. Voer de volgende query in, die de SupplierID, CompanyName, ContactName en ContactTitle kolommen voor elke leverancier retourneert. Houd er rekening mee dat deze query doelbewust de berekende kolom weglaat (FullContactName); we zullen de bijbehorende opgeslagen procedure bijwerken om deze kolom op te nemen in stap 4.

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

Nadat u de hoofdquery hebt ingevoerd en op Volgende hebt geklikt, kunnen we met de wizard de vier opgeslagen procedures noemen die worden gegenereerd. Noem deze opgeslagen procedures Suppliers_Select, Suppliers_Insert, Suppliers_Updateen Suppliers_Delete, zoals afbeelding 4 illustreert.

De namen van de automatisch gegenereerde opgeslagen procedures aanpassen

Afbeelding 4: De namen van de automatisch gegenereerde opgeslagen procedures aanpassen (klik hier om de volledige afbeelding weer te geven)

Met de volgende wizardstap kunnen we de TableAdapter-methoden een naam geven en de patronen opgeven die worden gebruikt voor toegang tot en bijwerken van gegevens. Laat alle drie de selectievakjes ingeschakeld, maar wijzig de naam van de GetData methode in GetSuppliers. Klik op Voltooien om de wizard te voltooien.

De naam van de GetData-methode wijzigen in GetSuppliers

Afbeelding 5: Wijzig de naam van de GetData methode in GetSuppliers (klik om de afbeelding op volledige grootte weer te geven)

Wanneer u op Voltooien klikt, maakt de wizard de vier opgeslagen procedures en voegt u de TableAdapter en de bijbehorende gegevenstabel toe aan de getypte gegevensset.

Stap 4: Inclusief de berekende kolom in de hoofdquery van TableAdapter

We moeten nu de TableAdapter en DataTable bijwerken die in stap 3 zijn gemaakt om de FullContactName berekende kolom op te nemen. Dit omvat twee stappen:

  1. Suppliers_Select De opgeslagen procedure bijwerken om de FullContactName berekende kolom te retourneren, en
  2. De gegevenstabel bijwerken om een corresponderende FullContactName kolom op te nemen.

Navigeer eerst naar Server Explorer en zoom in op de map Opgeslagen procedures. Open de Suppliers_Select opgeslagen procedure en werk de SELECT query bij om de FullContactName berekende kolom op te nemen:

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers

Sla de wijzigingen in de opgeslagen procedure op door op het pictogram Opslaan in de werkbalk te klikken door op Ctrl+S te drukken of door de optie Opslaan Suppliers_Select te kiezen in het menu Bestand.

Ga vervolgens terug naar DataSet Designer, klik met de rechtermuisknop op de SuppliersTableAdapterknop en kies Configureren in het contextmenu. Let op dat de kolom Suppliers_Select nu de kolom FullContactName bevat in zijn verzameling Gegevenskolommen.

Voer de configuratiewizard van TableAdapter uit om de kolommen van de gegevenstabel bij te werken

Afbeelding 6: Voer de configuratiewizard van TableAdapter uit om de kolommen van de gegevenstabel bij te werken (klik hier om de volledige afbeelding weer te geven)

Klik op Voltooien om de wizard te voltooien. Hiermee wordt automatisch een corresponderende kolom toegevoegd aan de SuppliersDataTable. De TableAdapter-wizard is intelligent genoeg om te detecteren dat de FullContactName kolom een berekende kolom is en daarom alleen lezen is. Daarom wordt de kolomReadOnly eigenschap ingesteld op true. Als u dit wilt verifiëren, selecteert u de kolom vanuit de SuppliersDataTable en gaat u naar het Eigenschappenvenster (zie afbeelding 7). Houd er rekening mee dat de FullContactName kolommen DataType en MaxLength eigenschappen ook dienovereenkomstig worden ingesteld.

De kolom FullContactName is gemarkeerd als alleen lezen

Afbeelding 7: De FullContactName kolom is gemarkeerd als Read-Only (klik om de afbeelding op volledige grootte weer te geven)

Stap 5: EenGetSupplierBySupplierIDmethode toevoegen aan de TableAdapter

Voor deze zelfstudie maken we een ASP.NET pagina waarin de leveranciers in een bijwerkbaar raster worden weergegeven. In eerdere zelfstudies hebben we één record van de bedrijfslogicalaag bijgewerkt door die specifieke record op te halen uit de DAL als een sterk getypte gegevenstabel, de eigenschappen bij te werken en vervolgens de bijgewerkte gegevenstabel terug te sturen naar de DAL om de wijzigingen in de database door te geven. Om deze eerste stap uit te voeren: het ophalen van de record die wordt bijgewerkt vanuit de DAL, moeten we eerst een GetSupplierBySupplierID(supplierID) methode toevoegen aan de DAL.

Klik met de rechtermuisknop op het SuppliersTableAdapter ontwerp van de gegevensset en kies de optie Query toevoegen in het contextmenu. Zoals we in stap 3 hebben gedaan, laat de wizard een nieuwe opgeslagen procedure voor ons genereren door de optie Nieuwe opgeslagen procedure maken te selecteren (raadpleeg afbeelding 3 voor een schermopname van deze wizardstap). Omdat deze methode een record met meerdere kolommen retourneert, geeft u aan dat we een SQL-query willen gebruiken die een SELECT is die rijen retourneert en op Volgende klikt.

Kies de SELECT-optie die rijen retourneert

Afbeelding 8: Kies de SELECT die de optie rijen retourneert (klik om de afbeelding op volledige grootte weer te geven)

De volgende stap vraagt ons om de query die voor deze methode moet worden gebruikt. Voer het volgende in, waarmee dezelfde gegevensvelden worden geretourneerd als de hoofdquery, maar voor een bepaalde leverancier.

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID

In het volgende scherm wordt gevraagd om de opgeslagen procedure een naam te geven die automatisch wordt gegenereerd. Geef deze opgeslagen procedure Suppliers_SelectBySupplierID een naam en klik op Volgende.

Geef de opgeslagen procedure een naam Suppliers_SelectBySupplierID

Afbeelding 9: Geef de opgeslagen procedure Suppliers_SelectBySupplierID een naam (klik hier om de afbeelding op volledige grootte weer te geven)

Ten slotte vraagt de wizard ons om de gegevenstoegangspatronen en methodenamen te gebruiken voor de TableAdapter. Laat beide selectievakjes ingeschakeld, maar wijzig de naam van respectievelijk de FillBy en GetDataBy methoden in FillBySupplierID en GetSupplierBySupplierID, respectievelijk.

Geef de TableAdapter Methods FillBySupplierID en GetSupplierBySupplierID een naam

Afbeelding 10: Geef de TableAdapter-methoden FillBySupplierID een naam en GetSupplierBySupplierID (klik hier om de volledige afbeelding weer te geven)

Klik op Voltooien om de wizard te voltooien.

Stap 6: De bedrijfslogicalaag creëren

Voordat we een ASP.NET pagina maken die gebruikmaakt van de berekende kolom die in stap 1 is gemaakt, moeten we eerst de bijbehorende methoden toevoegen in de BLL. Met onze ASP.NET pagina, die we in stap 7 gaan maken, kunnen gebruikers leveranciers bekijken en bewerken. Daarom moeten we ervoor zorgen dat onze BLL ten minste een methode biedt voor het verkrijgen van alle leveranciers en een andere methode voor het bijwerken van een bepaalde leverancier.

Maak een nieuw klassebestand met de naam SuppliersBLLWithSprocs in de ~/App_Code/BLL map en voeg de volgende code toe:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class SuppliersBLLWithSprocs
{
    private SuppliersTableAdapter _suppliersAdapter = null;
    protected SuppliersTableAdapter Adapter
    {
        get
        {
            if (_suppliersAdapter == null)
                _suppliersAdapter = new SuppliersTableAdapter();
            return _suppliersAdapter;
        }
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, true)]
    public NorthwindWithSprocs.SuppliersDataTable GetSuppliers()
    {
        return Adapter.GetSuppliers();
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Update, true)]
    public bool UpdateSupplier(string companyName, string contactName, 
        string contactTitle, int supplierID)
    {
        NorthwindWithSprocs.SuppliersDataTable suppliers = 
            Adapter.GetSupplierBySupplierID(supplierID);
        if (suppliers.Count == 0)
            // no matching record found, return false
            return false;
        NorthwindWithSprocs.SuppliersRow supplier = suppliers[0];
        supplier.CompanyName = companyName;
        if (contactName == null) 
            supplier.SetContactNameNull(); 
        else 
            supplier.ContactName = contactName;
        if (contactTitle == null) 
            supplier.SetContactTitleNull(); 
        else 
            supplier.ContactTitle = contactTitle;
        // Update the product record
        int rowsAffected = Adapter.Update(supplier);
        // Return true if precisely one row was updated, otherwise false
        return rowsAffected == 1;
    }
}

Net als de andere BLL-klassen heeft SuppliersBLLWithSprocs een eigenschap die eenprotectedAdapterexemplaar van de SuppliersTableAdapter klasse retourneert, samen met twee public methoden: GetSuppliers en UpdateSupplier. De GetSuppliers methode roept de bijbehorende SuppliersDataTable methode in de Data Access-laag aan en retourneert het resultaat dat door deze methode is geretourneerd als GetSupplier. De UpdateSupplier methode haalt informatie op over de specifieke leverancier die wordt bijgewerkt via een aanroep naar de DAL-methode GetSupplierBySupplierID(supplierID) . Vervolgens worden de CategoryName, ContactName, en ContactTitle eigenschappen bijgewerkt en worden deze wijzigingen doorgevoerd in de database door de Data Access Layer methode Update aan te roepen, waarbij het gewijzigde SuppliersRow object wordt doorgegeven.

Opmerking

Met uitzondering van SupplierID en CompanyName staan alle kolommen in de tabel Leveranciers NULL waarden toe. Als de doorgegeven parameters contactName of contactTitle gelijk zijn aan null, moeten we de bijbehorende ContactName en ContactTitle instellen op een NULL databasewaarde, met behulp van de methoden SetContactNameNull en SetContactTitleNull, respectievelijk.

Stap 7: Werken met de berekende kolom uit de presentatielaag

Nu de berekende kolom is toegevoegd aan de Suppliers tabel en de DAL en BLL dienovereenkomstig zijn bijgewerkt, zijn we klaar om een ASP.NET pagina te maken die werkt met de FullContactName berekende kolom. Begin met het openen van de ComputedColumns.aspx pagina in de AdvancedDAL map en sleep een GridView van de gereedschapskist naar de ontwerper. Stel de eigenschap van de GridView in op IDSuppliers en koppel deze via de smart tag aan een nieuwe ObjectDataSource genaamd SuppliersDataSource. Configureer de ObjectDataSource om de SuppliersBLLWithSprocs klasse te gebruiken die we in stap 6 hebben toegevoegd en klik op Volgende.

De ObjectDataSource configureren voor het gebruik van de klasse SuppliersBLLWithSprocs

Afbeelding 11: De ObjectDataSource configureren om de SuppliersBLLWithSprocs klasse te gebruiken (klik om de afbeelding op volledige grootte weer te geven)

Er zijn slechts twee methoden gedefinieerd in de SuppliersBLLWithSprocs klasse: GetSuppliers en UpdateSupplier. Zorg ervoor dat deze twee methoden zijn opgegeven in respectievelijk de tabbladen SELECT en UPDATE en klik op Voltooien om de configuratie van de ObjectDataSource te voltooien.

Na voltooiing van de wizard Gegevensbronconfiguratie voegt Visual Studio een BoundField toe voor elk van de geretourneerde gegevensvelden. Verwijder het SupplierID BoundField en wijzig de HeaderText eigenschappen van de CompanyName, ContactName, ContactTitle en FullContactName BoundFields respectievelijk in Company, Contact Name, Title, en Full Contact Name. Schakel in het infolabel het selectievakje Bewerken inschakelen in om de ingebouwde bewerkingsmogelijkheden van GridView in te schakelen.

Naast het toevoegen van BoundFields aan GridView zorgt de voltooiing van de wizard Gegevensbron er ook voor dat Visual Studio de eigenschap ObjectDataSource OldValuesParameterFormatString instelt op original_{0}. Zet deze instelling terug naar de standaardwaarde. {0}

Nadat u deze wijzigingen hebt uitgevoerd in GridView en ObjectDataSource, moeten de declaratieve markeringen er ongeveer als volgt uitzien:

<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="SupplierID" DataSourceID="SuppliersDataSource">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:BoundField DataField="CompanyName" 
            HeaderText="Company" 
            SortExpression="CompanyName" />
        <asp:BoundField DataField="ContactName" 
            HeaderText="Contact Name" 
            SortExpression="ContactName" />
        <asp:BoundField DataField="ContactTitle" 
            HeaderText="Title" 
            SortExpression="ContactTitle" />
        <asp:BoundField DataField="FullContactName" 
            HeaderText="Full Contact Name"
            SortExpression="FullContactName" 
            ReadOnly="True" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLLWithSprocs" 
        UpdateMethod="UpdateSupplier">
    <UpdateParameters>
        <asp:Parameter Name="companyName" Type="String" />
        <asp:Parameter Name="contactName" Type="String" />
        <asp:Parameter Name="contactTitle" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

Ga vervolgens via een browser naar deze pagina. Zoals in afbeelding 12 wordt weergegeven, wordt elke leverancier weergegeven in een raster dat de kolom bevat, waarvan de FullContactName waarde simpelweg de samenvoeging is van de andere drie kolommen die zijn opgemaakt als ContactName (ContactTitle, CompanyName) .

Elke leverancier wordt vermeld in het raster

Afbeelding 12: Elke leverancier wordt vermeld in het raster (klik om de afbeelding volledig weer te geven)

Als u op de knop Bewerken voor een bepaalde leverancier klikt, veroorzaakt dit een postback en zal die rij worden weergegeven in de bewerkingsinterface (zie afbeelding 13). De eerste drie kolommen worden weergegeven in hun standaardbewerkingsinterface: een tekstvakbesturingselement waarvan Text de eigenschap is ingesteld op de waarde van het gegevensveld. De FullContactName kolom blijft echter behouden als tekst. Toen de BoundFields aan de GridView zijn toegevoegd na voltooiing van de wizard Gegevensbronconfiguratie, is de eigenschap FullContactName BoundField ReadOnly ingesteld true, omdat de bijbehorende kolom FullContactName in de SuppliersDataTable zijn eigenschap ReadOnly heeft ingesteld op true. Zoals vermeld in stap 4, is de FullContactName eigenschap s ReadOnly ingesteld op true omdat de TableAdapter heeft gedetecteerd dat de kolom een berekende kolom was.

De kolom FullContactName kan niet worden bewerkt

Afbeelding 13: De FullContactName kolom kan niet worden bewerkt (klik om de afbeelding op volledige grootte weer te geven)

Werk de waarde van een of meer bewerkbare kolommen bij en klik op Bijwerken. Let op hoe de waarde van de FullContactName s automatisch wordt bijgewerkt om de wijziging weer te geven.

Opmerking

GridView maakt momenteel gebruik van BoundFields voor de bewerkbare velden, wat resulteert in de standaardbewerkingsinterface. Omdat het CompanyName veld vereist is, moet het worden geconverteerd naar een TemplateField dat een RequiredFieldValidator bevat. Ik laat dit achter als oefening voor de geïnteresseerde lezer. Raadpleeg de zelfstudie Validatiebesturingselementen toevoegen aan de zelfstudie Interfaces bewerken en invoegen voor stapsgewijze instructies over het converteren van een BoundField naar een TemplateField en het toevoegen van validatiebesturingselementen.

Samenvatting

Wanneer u het schema voor een tabel definieert, staat Microsoft SQL Server het opnemen van berekende kolommen toe. Dit zijn kolommen waarvan de waarden worden berekend op basis van een expressie die meestal verwijst naar de waarden uit andere kolommen in dezelfde record. Omdat de waarden voor berekende kolommen zijn gebaseerd op een expressie, zijn ze alleen toegankelijk voor lezen en kan er geen waarde in een INSERT of UPDATE instructie aan worden toegewezen. Dit zorgt voor uitdagingen bij het gebruik van een berekende kolom in de hoofdquery van een TableAdapter die automatisch overeenkomstige INSERT, UPDATE en DELETE instructies probeert te genereren.

In deze zelfstudie hebben we technieken besproken voor het omzeilen van de uitdagingen die worden gesteld door berekende kolommen. We hebben met name opgeslagen procedures in onze TableAdapter gebruikt om de broosheid te overwinnen die inherent is aan TableAdapters die ad-hoc SQL-instructies gebruiken. Wanneer de TableAdapter-wizard nieuwe opgeslagen procedures maakt, is het belangrijk dat de hoofdquery in eerste instantie berekende kolommen weglaat, aangezien hun aanwezigheid voorkomt dat opgeslagen procedures voor het wijzigen van gegevens worden gegenereerd. Nadat de TableAdapter in eerste instantie is geconfigureerd, kan de SelectCommand opgeslagen procedure worden hergebruikt om berekende kolommen op te nemen.

Veel plezier met programmeren!

Over de auteur

Scott Mitchell, auteur van zeven ASP/ASP.NET-boeken en oprichter van 4GuysFromRolla.com, werkt sinds 1998 met Microsoft-webtechnologieën. Scott werkt als onafhankelijk consultant, trainer en schrijver. Zijn laatste boek is Sams Teach Yourself ASP.NET 2.0 in 24 uur. Hij kan worden bereikt op mitchell@4GuysFromRolla.com.

Speciale dank aan

Deze tutorialreeks is beoordeeld door veel behulpzame beoordelers. Hoofdrevisoren voor deze handleiding waren Hilton Geisenow en Teresa Murphy. Bent u geïnteresseerd in het bekijken van mijn aanstaande MSDN-artikelen? Zo ja, laat iets van je horen via mitchell@4GuysFromRolla.com.