Dela via


Arbeta med beräknade kolumner (VB)

av Scott Mitchell

Ladda ned PDF

När du skapar en databastabell kan du med Microsoft SQL Server definiera en beräknad kolumn vars värde beräknas från ett uttryck som vanligtvis refererar till andra värden i samma databaspost. Sådana värden är skrivskyddade i databasen, vilket kräver särskilda överväganden när du arbetar med TableAdapters. I den här guiden lär vi oss att bemöta de utmaningar som beräknade kolumner innebär.

Inledning

Microsoft SQL Server tillåter beräknade kolumner, som är kolumner vars värden beräknas från ett uttryck som vanligtvis refererar till värdena från andra kolumner i samma tabell. En tidsspårningsdatamodell kan till exempel ha en tabell med namnet ServiceLog med kolumner som ServicePerformedbland annat , EmployeeID, Rateoch , och Duration. Även om det belopp som förfaller per tjänstobjekt (som är priset multiplicerat med varaktigheten) kan beräknas via en webbsida eller ett annat programmatiskt gränssnitt, kan det vara praktiskt att inkludera en kolumn i ServiceLog tabellen med namnet AmountDue som rapporterade den här informationen. Den här kolumnen kan skapas som en normal kolumn, men den skulle behöva uppdateras varje gång Rate- eller Duration-kolumnvärdena ändras. En bättre metod är att göra AmountDue kolumnen till en beräknad kolumn med uttrycket Rate * Duration. Detta skulle göra att SQL Server automatiskt beräknar AmountDue kolumnvärdet när det refererades i en fråga.

Eftersom värdet för en beräknad kolumn bestäms av ett uttryck är sådana kolumner skrivskyddade och kan därför inte ha värden tilldelade till dem i INSERT eller UPDATE -uttryck. Men när beräknade kolumner är en del av huvudfrågan för en TableAdapter som använder ad hoc SQL-instruktioner inkluderas de automatiskt i de automatiskt genererade INSERT - och UPDATE -uttrycken. Därför måste TableAdapter s INSERT och UPDATE frågor och InsertCommand och UpdateCommand egenskaper uppdateras för att ta bort referenser till beräknade kolumner.

En utmaning med att använda beräknade kolumner med en TableAdapter som använder ad hoc SQL-instruktioner är att TableAdapter s INSERT och UPDATE frågor återskapas automatiskt när konfigurationsguiden för TableAdapter har slutförts. Därför kommer de manuellt borttagna beräknade kolumnerna från INSERT och UPDATE frågorna att visas igen om guiden körs på nytt. Även om TableAdapters som använder lagrade procedurer inte lider av denna skörhet, har de sina egna egenheter som vi kommer att ta itu med i steg 3.

I den här självstudien lägger vi till en beräknad kolumn Suppliers i tabellen i Northwind-databasen och skapar sedan en motsvarande TableAdapter för att arbeta med den här tabellen och dess beräknade kolumn. Vi kommer att låta vår TableAdapter använda lagrade procedurer i stället för ad hoc-SQL-instruktioner så att våra anpassningar inte går förlorade när konfigurationsguiden TableAdapter används.

Låt oss komma igång!

Steg 1: Lägga till en beräknad kolumn i tabellenSuppliers

Northwind-databasen har inga beräknade kolumner, så vi måste lägga till en själva. I den här självstudien ska vi lägga till en beräknad kolumn Suppliers i tabellen med namnet FullContactName som returnerar kontaktens namn, rubrik och företaget som de arbetar för i följande format: ContactName (ContactTitle, CompanyName). Den här beräknade kolumnen kan användas i rapporter när du visar information om leverantörer.

Börja med att öppna tabelldefinitionen Suppliers genom att högerklicka på Suppliers tabellen i Serverutforskaren och välja Öppna tabelldefinition från snabbmenyn. Då visas kolumnerna i tabellen och deras egenskaper, till exempel deras datatyp, om de tillåter NULL s och så vidare. Om du vill lägga till en beräknad kolumn börjar du med att skriva in namnet på kolumnen i tabelldefinitionen. Ange sedan dess uttryck i textrutan (Formel) under avsnittet Beräknad kolumnspecifikation i fönstret Kolumnegenskaper (se bild 1). Namnge den beräknade kolumnen FullContactName och använd följande uttryck:

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

Observera att strängar kan sammanfogas i SQL med hjälp av operatorn + . Instruktionen CASE kan användas som ett villkor i ett traditionellt programmeringsspråk. I uttrycket ovan kan instruktionen CASE läsas som: Om ContactTitle inte är NULL skriver ContactTitle-värdet sammanfogat med ett kommatecken, annars skrivs inget. Mer information om instruktionens användbarhet finns i CASESQL-instruktionerCASE.

Anmärkning

I stället för att använda en CASE instruktion här kan vi ha använt ISNULL(ContactTitle, ''). ISNULL(checkExpression, replacementValue) returnerar checkExpression om det inte är null, annars returneras replacementValue. Även om antingen ISNULL eller CASE kommer att fungera i den här instansen finns det mer invecklade scenarier där flexibiliteten i -instruktionen CASE inte kan matchas av ISNULL.

När du har lagt till den här beräknade kolumnen bör skärmen se ut som skärmbilden i bild 1.

Lägg till en beräknad kolumn med namnet FullContactName i tabellen Leverantörer

Bild 1: Lägg till en beräknad kolumn med namnet FullContactName i Suppliers tabellen (Klicka om du vill visa en bild i full storlek)

När du har namngett den beräknade kolumnen och angett dess uttryck sparar du ändringarna i tabellen genom att klicka på ikonen Spara i verktygsfältet, genom att trycka på Ctrl+S eller genom att gå till menyn Arkiv och välja Spara Suppliers.

Om du sparar tabellen bör serverutforskaren uppdateras, inklusive kolumnen som just har lagts till i Suppliers tabellens kolumnlista. Dessutom justeras uttrycket som anges i textrutan (Formel) automatiskt till ett motsvarande uttryck som tar bort onödiga blanksteg, omger kolumnnamn med hakparenteser ([]) och innehåller parenteser för att mer explicit visa åtgärdsordningen:

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

Mer information om beräknade kolumner i Microsoft SQL Server finns i den tekniska dokumentationen. Se även anvisningar för hur du: Ange beräknade kolumner för en stegvis genomgång av hur du skapar beräknade kolumner.

Anmärkning

Som standard lagras inte beräknade kolumner fysiskt i tabellen, utan beräknas i stället om varje gång de refereras till i en fråga. Genom att markera kryssrutan Är bevarad kan du dock instruera SQL Server att fysiskt lagra den beräknade kolumnen i tabellen. På så sätt kan ett index skapas i den beräknade kolumnen, vilket kan förbättra prestandan för frågor som använder det beräknade kolumnvärdet i sina WHERE satser. Mer information finns i Skapa index för beräknade kolumner .

Steg 2: Visa värden för beräknade kolumner

Innan vi börjar arbeta med Data Access Layer, låt oss ta ett ögonblick för att visa FullContactName värdena. I Serverutforskaren högerklickar du på Suppliers tabellnamnet och väljer Ny fråga på snabbmenyn. Då visas ett frågefönster som uppmanar oss att välja vilka tabeller som ska inkluderas i frågan. Lägg till tabellen Suppliers och klicka på Stäng. Kontrollera sedan kolumnerna CompanyName, ContactName, ContactTitleoch FullContactName från tabellen Leverantörer. Klicka slutligen på den röda utropstecknet i verktygsfältet för att köra frågan och visa resultatet.

Som bild 2 visar innehåller resultaten FullContactName, som listar kolumnerna CompanyName, ContactName, och ContactTitle med formatet ContactName (ContactTitle, CompanyName).

FullContactName använder formatet ContactName (ContactTitle, CompanyName)

Bild 2: FullContactName Använder formatet ContactName (ContactTitle, CompanyName) (Klicka om du vill visa en bild i full storlek)

Steg 3: Lägga till SuppliersTableAdapter i dataåtkomstskiktet

För att kunna arbeta med leverantörsinformationen i vårt program måste vi först skapa en TableAdapter och DataTable i vår DAL. Helst skulle detta åstadkommas med samma enkla steg som undersöktes i tidigare självstudier. Men att arbeta med beräknade kolumner introducerar några rynkor som förtjänar diskussion.

Om du använder en TableAdapter som använder ad hoc SQL-instruktioner kan du helt enkelt inkludera den beräknade kolumnen i TableAdapter-huvudfrågan via guiden Konfiguration av TableAdapter. Detta kommer dock automatiskt att generera INSERT samt UPDATE instruktioner som innehåller den beräknade kolumnen. Om du försöker köra någon av dessa metoder kommer ett SqlException med meddelandet att kastas: Kolumnen Kolumnnamn kan inte ändras eftersom det antingen är en beräknad kolumn eller resultatet av en UNION-operator. Även om instruktionen INSERT och UPDATE kan justeras manuellt via TableAdapter s InsertCommand och UpdateCommand egenskaper, går dessa anpassningar förlorade när guiden TableAdapter Configuration körs igen.

På grund av skörheten hos TableAdapters som använder ad hoc SQL-instruktioner rekommenderar vi att vi använder lagrade procedurer när vi arbetar med beräknade kolumner. Om du använder befintliga lagrade procedurer konfigurerar du bara TableAdapter enligt beskrivningen i självstudien Använda befintliga lagrade procedurer för Typed DataSets TableAdapters. Om TableAdapter-guiden skapar de lagrade procedurerna åt dig, är det dock viktigt att du inledningsvis utelämnar beräknade kolumner från huvudfrågan. Om du inkluderar en beräknad kolumn i huvudfrågan informerar guiden TableAdapter-konfiguration dig om att den inte kan skapa motsvarande lagrade procedurer när det är klart. Kort därefter måste vi först konfigurera TableAdapter med hjälp av en beräknad kolumnfri huvudfråga och sedan uppdatera motsvarande lagrade procedur manuellt och TableAdapter s SelectCommand för att inkludera den beräknade kolumnen. Den här metoden liknar den som används i handledningen Uppdatera TableAdapter för att användaJOINs .

I den här självstudien ska vi lägga till en ny TableAdapter och låta den automatiskt skapa de lagrade procedurerna åt oss. Därför måste vi först utelämna den FullContactName beräknade kolumnen från huvudfrågan.

Börja med att NorthwindWithSprocs öppna DataSet i ~/App_Code/DAL mappen . Högerklicka i Designer och välj att lägga till en ny TableAdapter på snabbmenyn. Då startas konfigurationsguiden för TableAdapter. Ange databasen för att fråga efter data från (NORTHWNDConnectionString från Web.config) och klicka på Nästa. Eftersom vi ännu inte har skapat några lagrade procedurer för att fråga eller ändra Suppliers tabellen väljer du alternativet Skapa nya lagrade procedurer så att guiden skapar dem åt oss och klickar på Nästa.

Välj alternativet Skapa nya lagrade procedurer

Bild 3: Välj alternativet Skapa nya lagrade procedurer (Klicka om du vill visa en bild i full storlek)

I det efterföljande steget uppmanas vi att ange huvudfrågan. Ange följande fråga, som returnerar kolumnerna SupplierID, CompanyName, ContactNameoch ContactTitle för varje leverantör. Observera att den här frågan avsiktligt utelämnar den beräknade kolumnen (FullContactName); vi uppdaterar motsvarande lagrade procedur så att den inkluderar den här kolumnen i steg 4.

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

När du har angett huvudfrågan och klickat på Nästa kan vi med guiden namnge de fyra lagrade procedurer som genereras. Namnge dessa lagrade procedurer Suppliers_Select, Suppliers_Insert, Suppliers_Updateoch Suppliers_Delete, som bild 4 illustrerar.

Anpassa namnen på de automatiskt genererade lagrade procedurerna

Bild 4: Anpassa namnen på de automatiskt genererade lagrade procedurerna (Klicka om du vill visa en bild i full storlek)

Med nästa guidesteg kan vi namnge TableAdapter-metoderna och ange de mönster som används för att komma åt och uppdatera data. Låt alla tre kryssrutorna vara markerade, men byt namn på GetData metoden till GetSuppliers. Klicka på Slutför för att slutföra guiden.

Byt namn på GetData-metoden till GetSuppliers

Bild 5: Byt namn på GetData metoden till GetSuppliers (Klicka om du vill visa en bild i full storlek)

När du klickar på Slutför skapar guiden de fyra lagrade procedurerna och lägger till TableAdapter och motsvarande DataTable i Typed DataSet.

Steg 4: Inkludera den beräknade kolumnen i TableAdapter s Main Query

Nu måste vi uppdatera TableAdapter och DataTable som skapades i steg 3 för att inkludera den FullContactName beräknade kolumnen. Detta omfattar två steg:

  1. Uppdatera den Suppliers_Select lagrade proceduren för att returnera den FullContactName beräknade kolumnen och
  2. Uppdaterar DataTable så att den innehåller en motsvarande FullContactName kolumn.

Börja med att navigera till Server Explorer och gå nedåt i mappen Lagrade procedurer. Öppna den Suppliers_Select lagrade proceduren och uppdatera SELECT frågan så att den innehåller den FullContactName beräknade kolumnen:

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

Spara ändringarna i den lagrade proceduren genom att klicka på ikonen Spara i verktygsfältet, genom att trycka på Ctrl +S eller genom att välja alternativet Spara Suppliers_Select på Arkiv-menyn.

Gå sedan tillbaka till DataSet Designer, högerklicka på SuppliersTableAdapteroch välj Konfigurera på snabbmenyn. Observera att Suppliers_Select kolumnen nu innehåller FullContactName kolumnen i samlingen Datakolumner.

Kör konfigurationsguiden för TableAdapter för att uppdatera DataTable s-kolumnerna

Bild 6: Kör konfigurationsguiden för TableAdapter för att uppdatera datatabellkolumnerna (Klicka om du vill visa en bild i full storlek)

Klicka på Slutför för att slutföra guiden. Detta lägger automatiskt till en motsvarande kolumn i SuppliersDataTable. Guiden för TableAdapter är tillräckligt smart för att identifiera att kolumnen FullContactName är en beräknad kolumn och därför skrivskyddad. Därför anger den kolumnens ReadOnly egenskap till true. Kontrollera detta genom att välja kolumnen från SuppliersDataTable och sedan gå till fönstret Egenskaper (se bild 7). Observera att kolumnens FullContactName och egenskaperna DataType och MaxLength också anges därefter.

Kolumnen FullContactName är markerad som skrivskyddad

Bild 7: Kolumnen FullContactName är markerad som Read-Only (Klicka om du vill visa en bild i full storlek)

Steg 5: Lägga till enGetSupplierBySupplierIDmetod i TableAdapter

I den här självstudien skapar vi en ASP.NET sida som visar leverantörerna i ett uppdateringsbart rutnät. I tidigare handledningar har vi uppdaterat en enda post från affärslogiklagret genom att hämta den aktuella posten från DAL som en starkt typad datatabell, uppdatera dess egenskaper och sedan skicka den uppdaterade datatabellen tillbaka till DAL för att reflektera ändringarna i databasen. För att kunna utföra det här första steget – hämta posten som uppdateras från DAL – måste vi först lägga till en GetSupplierBySupplierID(supplierID) metod i DAL.

Högerklicka på SuppliersTableAdapter i DataSet Design och välj alternativet Lägg till fråga på snabbmenyn. Som vi gjorde i steg 3 låter du guiden generera en ny lagrad procedur åt oss genom att välja alternativet Skapa ny lagrad procedur (se bild 3 för en skärmbild av det här guidesteget). Eftersom den här metoden returnerar en post med flera kolumner anger du att vi vill använda en SQL-fråga som är en SELECT som returnerar rader och klickar på Nästa.

Välj alternativet VÄLJ som returnerar rader

Bild 8: Välj alternativet VÄLJ som returnerar rader (Klicka om du vill visa en bild i full storlek)

I det efterföljande steget uppmanas vi att ange en fråga för denna metod. Ange följande, som returnerar samma datafält som huvudfrågan men för en viss leverantör.

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

Nästa skärm ber oss namnge den lagrade proceduren som genereras automatiskt. Namnge den här lagrade proceduren Suppliers_SelectBySupplierID och klicka på Nästa.

Ge den lagrade proceduren namnet Suppliers_SelectBySupplierID

Bild 9: Namnge den lagrade proceduren Suppliers_SelectBySupplierID (Klicka om du vill visa en bild i full storlek)

Slutligen uppmanar guiden oss att ange vilka dataåtkomstmönster och metodnamn som ska användas för TableAdapter. Låt båda kryssrutorna vara markerade, men byt namn på metoderna FillBy och GetDataBy till FillBySupplierID och GetSupplierBySupplierID respektive.

Ange TableAdapter-metoderna FillBySupplierID och GetSupplierBySupplierID

Bild 10: Namnge TableAdapter-metoderna FillBySupplierID och GetSupplierBySupplierID (Klicka om du vill visa en bild i full storlek)

Klicka på Slutför för att slutföra guiden.

Steg 6: Skapa affärslogiklagret

Innan vi skapar en ASP.NET sida som använder den beräknade kolumnen som skapades i steg 1 måste vi först lägga till motsvarande metoder i BLL. Vår ASP.NET sida, som vi skapar i steg 7, gör det möjligt för användare att visa och redigera leverantörer. Därför behöver vi vår BLL för att åtminstone tillhandahålla en metod för att få alla leverantörer och en annan att uppdatera en viss leverantör.

Skapa en ny klassfil med namnet SuppliersBLLWithSprocs i ~/App_Code/BLL mappen och lägg till följande kod:

Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class SuppliersBLLWithSprocs
    Private _suppliersAdapter As SuppliersTableAdapter = Nothing
    Protected ReadOnly Property Adapter() As SuppliersTableAdapter
        Get
            If _suppliersAdapter Is Nothing Then
                _suppliersAdapter = New SuppliersTableAdapter()
            End If
            Return _suppliersAdapter
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetSuppliers() As NorthwindWithSprocs.SuppliersDataTable
        Return Adapter.GetSuppliers()
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Update, True)> _
    Public Function UpdateSupplier(companyName As String, contactName As String, _
        contactTitle As String, supplierID As Integer) As Boolean
        Dim suppliers As NorthwindWithSprocs.SuppliersDataTable = _
            Adapter.GetSupplierBySupplierID(supplierID)
        If suppliers.Count = 0 Then
            ' no matching record found, return false
            Return False
        End If
        Dim supplier As NorthwindWithSprocs.SuppliersRow = suppliers(0)
        supplier.CompanyName = companyName
        If contactName Is Nothing Then 
            supplier.SetContactNameNull() 
        Else 
            supplier.ContactName = contactName
        End If
        If contactTitle Is Nothing Then 
            supplier.SetContactTitleNull() 
        Else 
            supplier.ContactTitle = contactTitle
        End If
        ' Update the product record
        Dim rowsAffected As Integer = Adapter.Update(supplier)
        ' Return true if precisely one row was updated, otherwise false
        Return rowsAffected = 1
    End Function
End Class

Precis som de andra BLL-klasserna SuppliersBLLWithSprocs har en ProtectedAdapter egenskap som returnerar en instans av SuppliersTableAdapter klassen tillsammans med två Public metoder: GetSuppliers och UpdateSupplier. Metoden GetSuppliers anropar och returnerar den SuppliersDataTable som returneras av motsvarande GetSupplier metod i dataåtkomstlagret. Metoden UpdateSupplier hämtar information om den specifika leverantör som uppdateras via ett anrop till DAL-metoden GetSupplierBySupplierID(supplierID) . Den uppdaterar sedan CategoryName, ContactName och ContactTitle egenskaperna och registrerar dessa ändringar i databasen genom att anropa Data Access Layer:s Update-metod och skicka in det ändrade SuppliersRow-objektet.

Anmärkning

Förutom SupplierID och CompanyName tillåter alla kolumner i tabellen Leverantörer NULL-värden. Därför, om de införda contactName eller contactTitle parametrarna är Nothing måste vi ange motsvarande ContactName och ContactTitle egenskaper till ett NULL databasvärde med hjälp av SetContactNameNull och SetContactTitleNull metoderna.

Steg 7: Arbeta med den beräknade kolumnen från presentationslagret

När den beräknade kolumnen har lagts till i Suppliers tabellen och DAL- och BLL-filen har uppdaterats i enlighet med detta är vi redo att skapa en ASP.NET sida som fungerar med den FullContactName beräknade kolumnen. Öppna först sidan ComputedColumns.aspx i mappen AdvancedDAL och dra sedan en GridView från verktygslådan till designern. Ställ in GridViews ID-egenskap till Suppliers och använd dess snabbval för att binda den till en ny ObjectDataSource med namnet SuppliersDataSource. Konfigurera ObjectDataSource för att använda klassen SuppliersBLLWithSprocs som vi lade till i steg 6 och klicka på Nästa.

Konfigurera ObjectDataSource att använda klassen SuppliersBLLWithSprocs

Bild 11: Konfigurera ObjectDataSource att använda SuppliersBLLWithSprocs klassen (Klicka om du vill visa en bild i full storlek)

Det finns bara två metoder som definierats i SuppliersBLLWithSprocs klassen: GetSuppliers och UpdateSupplier. Kontrollera att dessa två metoder anges på flikarna SELECT respektive UPDATE och klicka på Slutför för att slutföra konfigurationen av ObjectDataSource.

När konfigurationsguiden för datakälla har slutförts lägger Visual Studio till ett BoundField för vart och ett av de datafält som returneras. Ta bort SupplierID BoundField och ändra egenskaperna för HeaderText, CompanyName, ContactName, ContactTitle och FullContactName BoundFields till Företag, Kontaktnamn, Rubrik och Fullständigt kontaktnamn, respektive. Från den smarta taggen markerar du kryssrutan Aktivera redigering för att aktivera GridViews inbyggda redigeringsfunktioner.

Förutom att lägga till BoundFields i GridView leder slutförandet av Datakällans guide också till att Visual Studio anger egenskapen ObjectDataSource OldValuesParameterFormatString till original_{0}. Återställ den här inställningen till dess standardvärde, {0} .

När du har gjort dessa ändringar i GridView och ObjectDataSource bör deras deklarativa markering se ut ungefär så här:

<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>

Gå sedan till den här sidan via en webbläsare. Som bild 12 visar visas varje leverantör i ett rutnät som innehåller FullContactName kolumnen, vars värde helt enkelt är sammanlänkningen av de övriga tre kolumnerna som är formaterade som ContactName (ContactTitle, CompanyName) .

Varje leverantör visas i rutnätet

Bild 12: Varje leverantör visas i rutnätet (klicka om du vill visa en bild i full storlek)

Om du klickar på knappen Redigera för en viss leverantör orsakas en återkoppling och raden återges i redigeringsgränssnittet (se bild 13). De första tre kolumnerna återges i standardredigeringsgränssnittet – en TextBox-kontroll vars Text egenskap är inställd på datafältets värde. Kolumnen FullContactName förblir dock som text. När BoundFields lades till i GridView vid slutförandet av konfigurationsguiden för datakällan angavs egenskapen för FullContactName BoundFields ReadOnly till True eftersom motsvarande kolumn FullContactName i SuppliersDataTable har sin ReadOnly egenskap inställd på True. Som anges i steg 4 FullContactName angavs egenskapen s ReadOnly till True eftersom TableAdapter upptäckte att kolumnen var en beräknad kolumn.

Kolumnen FullContactName kan inte redigeras

Bild 13: Kolumnen FullContactName kan inte redigeras (Klicka om du vill visa en bild i full storlek)

Gå vidare och uppdatera värdet för en eller flera av de redigerbara kolumnerna och klicka på Uppdatera. Observera hur FullContactName värdet för s uppdateras automatiskt för att återspegla ändringen.

Anmärkning

GridView använder för närvarande BoundFields för de redigerbara fälten, vilket resulterar i standardredigeringsgränssnittet. Eftersom fältet CompanyName krävs bör det konverteras till ett TemplateField som innehåller en RequiredFieldValidator. Jag lämnar detta som en övning för den intresserade läsaren. I självstudien Lägga till verifieringskontroller i gränssnitten för redigering och införande finns stegvisa instruktioner om hur du konverterar ett BoundField till ett TemplateField och lägger till verifieringskontroller.

Sammanfattning

När du definierar schemat för en tabell tillåter Microsoft SQL Server inkludering av beräknade kolumner. Det här är kolumner vars värden beräknas från ett uttryck som vanligtvis refererar till värdena från andra kolumner i samma post. Eftersom värdena för beräknade kolumner baseras på ett uttryck är de skrivskyddade och kan inte tilldelas ett värde i en INSERT eller UPDATE-uttryck. Detta medför utmaningar när du använder en beräknad kolumn i huvudfrågan för en TableAdapter som försöker generera motsvarande INSERT, UPDATEoch DELETE -instruktioner automatiskt.

I den här handledningen diskuterar vi tekniker för att kringgå de utmaningar som beräknade kolumner medför. I synnerhet använde vi lagrade procedurer i vår TableAdapter för att övervinna den skörhet som är inneboende i TableAdapters som använder ad hoc SQL-instruktioner. När du skapar nya lagrade procedurer i TableAdapter-guiden är det viktigt att huvudfrågan först utelämnar beräknade kolumner eftersom deras närvaro förhindrar att lagrade procedurer för dataändring genereras. När TableAdapter har konfigurerats från början kan den SelectCommand lagrade proceduren retuscheras så att den inkluderar alla beräknade kolumner.

Lycka till med programmerandet!

Om författaren

Scott Mitchell, författare till sju ASP/ASP.NET-böcker och grundare av 4GuysFromRolla.com, har arbetat med Microsofts webbtekniker sedan 1998. Scott arbetar som oberoende konsult, tränare och författare. Hans senaste bok är Sams Teach Yourself ASP.NET 2.0 på 24 timmar. Han kan nås på mitchell@4GuysFromRolla.com.

Särskilt tack till

Den här självstudieserien granskades av många användbara granskare. Huvudgranskare för den här handledningen var Hilton Geisenow och Teresa Murphy. Vill du granska mina kommande MSDN-artiklar? Om så är fallet, hör av dig på mitchell@4GuysFromRolla.com.