Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I tidigare handledningar har vi lärt oss hur ObjectDataSource-kontrollen möjliggör infogning, uppdatering och borttagning av data. SqlDataSource-kontrollen stöder samma åtgärder, men metoden är annorlunda, och den här självstudien visar hur du konfigurerar SqlDataSource för att infoga, uppdatera och ta bort data.
Inledning
Som beskrivs i En översikt över infogning, uppdatering och borttagning tillhandahåller GridView-kontrollen inbyggda funktioner för uppdatering och borttagning, medan kontrollerna DetailsView och FormView omfattar infogning av stöd tillsammans med redigering och borttagning av funktioner. Dessa funktioner för dataändring kan anslutas direkt till en datakällkontroll utan att en kodrad behöver skrivas. En översikt över infogning, uppdatering och borttagning undersöktes med hjälp av ObjectDataSource för att underlätta infogning, uppdatering och borttagning med kontrollerna GridView, DetailsView och FormView. Alternativt kan SqlDataSource användas i stället för ObjectDataSource.
Kom ihåg att för att stödja infogning, uppdatering och borttagning med ObjectDataSource behövde vi ange de objektskiktsmetoder som ska anropas för att utföra åtgärden infoga, uppdatera eller ta bort. Med SqlDataSource måste vi ange INSERT, UPDATEoch DELETE SQL-instruktioner (eller lagrade procedurer) för att köra. Som vi ser i den här självstudien kan dessa instruktioner skapas manuellt eller genereras automatiskt av guiden Konfigurera datakälla i SqlDataSource.
Anmärkning
Eftersom vi redan har diskuterat funktionerna för att infoga, redigera och ta bort i kontrollerna GridView, DetailsView och FormView fokuserar den här självstudien på att konfigurera SqlDataSource-kontrollen för att stödja dessa åtgärder. Om du behöver friska upp användningen av dessa funktioner i GridView, DetailsView och FormView bör du återvända till självstudierna för Redigera, Infoga och Ta bort data, som börjar med En översikt över infogning, uppdatering och borttagning.
Steg 1: Ange INSERT-, UPDATE- och DELETE-instruktioner
Som vi har sett i de två senaste självstudierna måste vi ange två egenskaper för att hämta data från en SqlDataSource-kontroll:
-
ConnectionString, som anger vilken databas som frågan ska skickas till och -
SelectCommand, som anger den ad hoc SQL-instruktion eller det lagrade procedurnamn som ska köras för att returnera resultatet.
För SelectCommand värden med parametrar anges parametervärdena via SqlDataSource-samlingen SelectParameters och kan innehålla hårdkodade värden, vanliga parameterkällvärden (frågesträngsfält, sessionsvariabler, webbkontrollvärden och så vidare) eller kan tilldelas programmatiskt. När SqlDataSource-kontrollmetoden Select() anropas antingen programmatiskt eller automatiskt från en datawebbkontroll upprättas en anslutning till databasen, tilldelas parametervärdena till frågan och kommandot skickas till databasen. Resultatet returneras sedan som antingen en DataSet eller DataReader, beroende på värdet för kontrollens DataSourceMode egenskap.
Förutom att välja data kan SqlDataSource-kontrollen användas för att infoga, uppdatera och ta bort data genom att INSERTange , UPDATEoch DELETE SQL-instruktioner på ungefär samma sätt. Ange helt enkelt InsertCommand, UpdateCommand och DeleteCommand-egenskaperna de INSERT, UPDATE och DELETE SQL-satser som ska exekveras. Om -uttrycken har parametrar (som de flesta alltid kommer att göra), tar du med dem i InsertParameters, UpdateParametersoch DeleteParameters -samlingarna.
När ett InsertCommandvärde , UpdateCommandeller DeleteCommand har angetts blir alternativet Aktivera infogning, Aktivera redigering eller Aktivera borttagning i motsvarande datawebbkontrolls smarta tagg tillgänglig. För att illustrera detta ska vi ta ett exempel från sidan Querying.aspx som vi skapade i självstudiekursen Fråga data med SqlDataSource Control och utöka den för att inkludera borttagningsfunktioner.
Börja med att öppna sidorna InsertUpdateDelete.aspx och Querying.aspx från SqlDataSource mapp. På Designersidan Querying.aspx väljer du SqlDataSource och GridView från det första exemplet (kontrollerna ProductsDataSource och GridView1). När du har valt de två kontrollerna går du till menyn Redigera och väljer Kopiera (eller trycker bara på Ctrl+C). Gå sedan till Designer för InsertUpdateDelete.aspx och klistra in kontrollerna. När du har flyttat över de två kontrollerna till InsertUpdateDelete.aspxtestar du sidan i en webbläsare. Du bör se värdena för kolumnerna ProductID, ProductNameoch UnitPrice för alla poster i databastabellen Products .
Bild 1: Alla produkter visas, sorterade efter ProductID (Klicka om du vill visa en bild i full storlek)
Lägga till egenskaperna DeleteCommand och DeleteParameters i SqlDataSource
Nu har vi en SqlDataSource som helt enkelt returnerar alla poster från Products tabellen och en GridView som återger dessa data. Vårt mål är att utöka det här exemplet så att användaren kan ta bort produkter via GridView. För att göra detta måste vi ange värden för SqlDataSource-kontrollens DeleteCommand och DeleteParameters egenskaperna och sedan konfigurera GridView för att stödja borttagning.
Egenskaperna DeleteCommand och DeleteParameters kan anges på flera olika sätt:
- Genom deklarativ syntax
- Från fönstret Egenskaper i designern
- Från skärmen Ange en anpassad SQL-instruktion eller lagrad procedur i guiden Konfigurera datakälla
- Via knappen Avancerat i skärmen för att ange kolumner från en tabell i guiden Konfigurera datakälla, genereras automatiskt SQL-instruktionen
DELETEoch parametersamlingen som används i egenskapernaDeleteCommandochDeleteParameters.
Vi undersöker hur du automatiskt skapar instruktionen DELETE i steg 2. Nu ska vi använda fönstret Egenskaper i designern, även om alternativet Konfigurera datakälla eller deklarativ syntax fungerar lika bra.
Från Designer i InsertUpdateDelete.aspxklickar du på SqlDataSource och tar sedan upp fönstret Egenskaper (från menyn Visa väljer du Fönstret Egenskaper eller trycker helt enkelt på ProductsDataSource F4). Välj egenskapen DeleteQuery, som tar upp en uppsättning ellipser.
Bild 2: Välj egenskapen DeleteQuery i fönstret Egenskaper
Anmärkning
SqlDataSource har ingen DeleteQuery-egenskap. I stället är DeleteQuery en kombination av DeleteCommand egenskaperna och DeleteParameters och visas bara i fönstret Egenskaper när du visar fönstret via designern. Om du tittar på fönstret Egenskaper i källvyn hittar DeleteCommand du egenskapen i stället.
Klicka på ellipserna i egenskapen DeleteQuery för att öppna dialogrutan Kommando- och parameterredigeraren (se bild 3). I den här dialogrutan kan du ange SQL-instruktionen DELETE och ange parametrarna. Ange följande fråga i DELETE kommandotextrutan (antingen manuellt eller med hjälp av Query Builder, om du vill):
DELETE FROM Products
WHERE ProductID = @ProductID
Klicka sedan på knappen Uppdatera parametrar för att lägga till parametern @ProductID i listan över parametrar nedan.
@ProductID som lagts till i listan över DELETE-kommandoparametrar." />
Bild 3: Välj egenskapen DeleteQuery i fönstret Egenskaper (Klicka om du vill visa en bild i full storlek)
Ange inte något värde för den här parametern (lämna parameterkällan till Ingen ). När vi lägger till stöd för borttagning i GridView anger GridView automatiskt det här parametervärdet med hjälp av värdet för samlingen DataKeys för raden vars borttagningsknapp klickades.
Anmärkning
Parameternamnet som används i DELETE frågan måste vara samma som namnet på DataKeyNames värdet i GridView, DetailsView eller FormView. Det vill säga parametern i -instruktionen DELETE heter @ProductID avsiktligt (i stället för till exempel @ID), eftersom kolumnnamnet för primärnyckeln i tabellen Produkter (och därmed värdet DataKeyNames i GridView) är ProductID.
Om parameternamnet och DataKeyNames värdet inte matchar kan GridView inte automatiskt tilldela parametern värdet från DataKeys samlingen.
När du har angett den borttagningsrelaterade informationen i dialogrutan Kommando- och parameterredigeraren klickar du på OK och går till källvyn för att undersöka den resulterande deklarativa markering:
<asp:SqlDataSource ID="ProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]"
DeleteCommand="DELETE FROM Products WHERE ProductID = @ProductID">
<DeleteParameters>
<asp:Parameter Name="ProductID" />
</DeleteParameters>
</asp:SqlDataSource>
Observera tillägget av DeleteCommand egenskapen samt <DeleteParameters> avsnittet och parameterobjektet med namnet productID.
Konfigurera GridView för borttagning
När egenskapen DeleteCommand har lagts till innehåller GridViews smarta tagg nu alternativet Aktivera borttagning. Markera den här kryssrutan. Som beskrivs i En översikt över infogning, uppdatering och borttagning gör detta att GridView lägger till ett CommandField med egenskapen ShowDeleteButton inställd på True. Som bild 4 visar inkluderas knappen Ta bort när sidan besöks via en webbläsare. Testa den här sidan genom att ta bort vissa produkter.
Bild 4: Varje GridView-rad innehåller nu en borttagningsknapp (klicka om du vill visa en bild i full storlek)
När du klickar på knappen Ta bort, sker en postback. GridView tilldelar ProductID-parametern värdet från DataKeys-samlingen för raden vars borttagningsknapp har klickats på och anropar metoden Delete() i SqlDataSource. SqlDataSource-kontrollen ansluter sedan till databasen och kör -instruktionen DELETE . GridView binds sedan om till SqlDataSource, hämtar tillbaka och visar den aktuella uppsättningen produkter (som inte längre innehåller den nyss borttagna posten).
Anmärkning
Eftersom GridView använder sin DataKeys samling för att fylla i SqlDataSource-parametrarna är det viktigt att Egenskapen GridView DataKeyNames anges till de kolumner som utgör primärnyckeln och att SqlDataSource SelectCommand returnerar dessa kolumner. Dessutom är det viktigt att parameternamnet i SqlDataSources DeleteCommand ska vara inställt på @ProductID. Om egenskapen DataKeyNames inte har angetts, eller om parametern inte heter @ProductsID, kommer ett återanrop att ske om du klickar på knappen Ta bort, men ingen post kommer faktiskt att tas bort.
Bild 5 visar den här interaktionen grafiskt. Gå tillbaka till självstudiekursen Undersöka händelser som är associerade med infoga, uppdatera och ta bort för en mer detaljerad diskussion om händelsekedjan som är associerad med att infoga, uppdatera och ta bort från en datawebbkontroll.
Bild 5: Om du klickar på knappen Ta bort i GridView anropas SqlDataSource-metoden Delete()
Steg 2: Generera INSERT, UPDATE och DELETE-instruktioner automatiskt
Som steg 1 undersökte, INSERT, UPDATEoch DELETE SQL-instruktioner kan anges via fönstret Egenskaper eller kontrollens deklarativa syntax. Den här metoden kräver dock att vi manuellt skriver ut SQL-satserna för hand, vilket kan vara monotont och felbenäget. Lyckligtvis ger guiden Konfigurera datakälla ett alternativ för att generera INSERT- UPDATEoch-instruktionerna DELETE automatiskt när du använder skärmen Ange kolumner från en tabell med vy.
Låt oss utforska det här alternativet för automatisk generering. Lägg till en DetailsView till designern i InsertUpdateDelete.aspx och ange dess ID egenskap till ManageProducts. Från Den smarta taggen DetailsView väljer du sedan att skapa en ny datakälla och skapa en SqlDataSource med namnet ManageProductsDataSource.
Bild 6: Skapa en ny SqlDataSource med namnet ManageProductsDataSource (Klicka om du vill visa en bild i full storlek)
I guiden Konfigurera datakälla väljer du att använda anslutningssträngen NORTHWINDConnectionString och klickar på Nästa. På skärmen Konfigurera välj instruktionens skärm, låter du den runda alternativknappen Ange kolumner från en tabell eller vy vara markerad, och därefter väljer du Products-tabellen i listrutan. Markera kolumnerna ProductID, ProductName, UnitPriceoch Discontinued i kryssrutan.
Bild 7: Med hjälp av tabellen Products returnerar du kolumnerna ProductID, ProductName, UnitPriceoch Discontinued (Klicka om du vill visa en bild i full storlek)
Om du vill generera INSERT, UPDATEoch DELETE -instruktioner automatiskt baserat på den valda tabellen och kolumnerna klickar du på knappen Avancerat och markerar kryssrutan Generera INSERT, UPDATEoch DELETE instruktioner.
Bild 8: Markera kryssrutan Generera INSERT, UPDATE, och DELETE uttalanden
Kryssrutan Generera INSERT, UPDATEoch DELETE -instruktioner kan bara kontrolleras om den valda tabellen har en primärnyckel och primärnyckelkolumnen (eller kolumnerna) ingår i listan över returnerade kolumner. Kryssrutan Använd optimistisk samtidighet, som blir valbar när kryssrutan Generera INSERT, UPDATE, och DELETE -instruktioner har markerats, kommer att utöka WHERE-satserna i de resulterande UPDATE- och DELETE-uttrycken för att ge optimistisk samtidighetskontroll. För närvarande lämna kryssrutan avmarkerad; vi ska undersöka optimistisk samtidighet med SqlDataSource-kontrollen i nästa handledning.
När du har kontrollerat kryssrutan Generera INSERT, UPDATEoch DELETE -instruktioner klickar du på OK för att återgå till skärmen Konfigurera välj instruktion och klickar sedan på Nästa och sedan Slutför för att slutföra guiden Konfigurera datakälla. När du har slutfört guiden lägger Visual Studio till BoundFields i DetailsView för kolumnerna ProductID, ProductNameoch UnitPrice och en CheckBoxField för Discontinued kolumnen. Från smarttaggen DetailsView kontrollerar du alternativet Aktivera sidindelning så att användaren som besöker den här sidan kan gå igenom produkterna. Rensa även DetailsView-egenskaperna Width och Height .
Observera att den smarta taggen har alternativen Aktivera infogning, Aktivera redigering och Aktivera borttagning tillgängliga. Det beror på att SqlDataSource innehåller värden för dess InsertCommand, UpdateCommandoch DeleteCommand, som följande deklarativa syntax visar:
<asp:DetailsView ID="ManageProducts" runat="server" AllowPaging="True"
AutoGenerateRows="False" DataKeyNames="ProductID"
DataSourceID="ManageProductsDataSource" EnableViewState="False">
<Fields>
<asp:BoundField DataField="ProductID" HeaderText="ProductID"
InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
<asp:BoundField DataField="ProductName" HeaderText="ProductName"
SortExpression="ProductName" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice"
SortExpression="UnitPrice" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued"
SortExpression="Discontinued" />
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="ManageProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
DeleteCommand=
"DELETE FROM [Products] WHERE [ProductID] = @ProductID"
InsertCommand=
"INSERT INTO [Products] ([ProductName], [UnitPrice], [Discontinued])
VALUES (@ProductName, @UnitPrice, @Discontinued)"
SelectCommand=
"SELECT [ProductID], [ProductName], [UnitPrice], [Discontinued]
FROM [Products]"
UpdateCommand=
"UPDATE [Products] SET [ProductName] = @ProductName,
[UnitPrice] = @UnitPrice, [Discontinued] = @Discontinued
WHERE [ProductID] = @ProductID">
<DeleteParameters>
<asp:Parameter Name="ProductID" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="ProductName" Type="String" />
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Discontinued" Type="Boolean" />
<asp:Parameter Name="ProductID" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="ProductName" Type="String" />
<asp:Parameter Name="UnitPrice" Type="Decimal" />
<asp:Parameter Name="Discontinued" Type="Boolean" />
</InsertParameters>
</asp:SqlDataSource>
Observera hur SqlDataSource-kontrollen har angett värden automatiskt för dess InsertCommandegenskaper , UpdateCommandoch DeleteCommand . Den uppsättning kolumner som refereras till i egenskapen InsertCommand och UpdateCommand är baserade på de i instruktionen SELECT. I stället för att ha varje produktkolumn i InsertCommand och UpdateCommandfinns det bara de kolumner som anges i SelectCommand (mindre ProductID, vilket utelämnas eftersom det är en IDENTITY kolumn, vars värde inte kan ändras när de redigeras och som tilldelas automatiskt när du infogar). För varje parameter i InsertCommandegenskaperna , UpdateCommandoch DeleteCommand finns dessutom motsvarande parametrar i samlingarna InsertParameters, UpdateParametersoch DeleteParameters .
Om du vill aktivera dataändringsfunktionerna i DetailsView kontrollerar du alternativen Aktivera infogning, Aktivera redigering och Aktivera borttagning i den smarta taggen. Detta lägger till ett CommandField med egenskaperna ShowInsertButton, ShowEditButtonoch ShowDeleteButton inställt på True.
Besök sidan i en webbläsare och notera knapparna Redigera, Ta bort och Nytt som ingår i DetailsView. Om du klickar på knappen Redigera omvandlas DetailsView till redigeringsläge, som visar varje BoundField vars ReadOnly egenskap är inställd False på (standard) som textruta och kryssrutan CheckBoxField.
Bild 9: Standardredigeringsgränssnittet för DetailsView (Klicka om du vill visa en bild i full storlek)
På samma sätt kan du ta bort den valda produkten eller lägga till en ny produkt i systemet. Eftersom -instruktionen InsertCommand endast fungerar med kolumnerna ProductName, UnitPriceoch Discontinued har de andra kolumnerna antingen NULL eller deras standardvärde som tilldelats av databasen vid infogning. Precis som med ObjectDataSource, om InsertCommand saknar databastabellkolumner som inte tillåter NULL s och inte har ett standardvärde, uppstår ett SQL-fel vid försök att köra -instruktionen INSERT .
Anmärkning
DetailsView-infognings- och redigeringsgränssnitten saknar någon form av anpassning eller validering. Om du vill lägga till verifieringskontroller eller anpassa gränssnitten måste du konvertera BoundFields till TemplateFields. Mer information finns i självstudierna Lägga till verifieringskontroller till redigerings- och infogningsgränssnittet och Anpassa gränssnittet för datamodifiering.
Tänk också på att för uppdatering och borttagning använder DetailsView den aktuella produktens DataKey värde, som endast finns om DataKeyNames egenskapen har konfigurerats. Om redigering eller borttagning inte verkar ha någon effekt kontrollerar du att egenskapen DataKeyNames har angetts.
Begränsningar för att generera SQL-instruktioner automatiskt
Eftersom alternativet Generera INSERT, UPDATEoch DELETE -instruktioner endast är tillgängligt när du väljer kolumner från en tabell, måste du för mer komplexa frågor skriva egna INSERT, UPDATEoch DELETE -instruktioner som vi gjorde i steg 1. Vanligtvis använder SQL-uttryck SELECT s JOIN för att hämta data från en eller flera uppslagstabeller för visningsändamål (till exempel att hämta Categories-fältet från CategoryName-tabellen när produktinformation visas). Samtidigt kanske vi vill tillåta att användaren redigerar, uppdaterar eller infogar data i kärntabellen (Productsi det här fallet).
Även om INSERT, UPDATE och DELETE-instruktionerna kan anges manuellt, tänk på följande tidsbesparande tips. Konfigurera först SqlDataSource så att den hämtar data bara från Products tabellen. Använd guiden Konfigurera datakälla: Ange kolumner från en tabell eller vy så att du automatiskt kan generera INSERT, UPDATE, och DELETE-uttrycken. När du har slutfört guiden väljer du sedan att konfigurera SelectQuery från fönstret Egenskaper (eller också går du tillbaka till guiden Konfigurera datakälla, men använder alternativet Ange en anpassad SQL-instruktion eller lagrad procedur). Uppdatera sedan -instruktionen SELECT så att den innehåller syntaxen JOIN . Den här tekniken ger de tidsbesparande fördelarna med de automatiskt genererade SQL-uttrycken och möjliggör en mer anpassad SELECT instruktion.
En annan begränsning med att automatiskt generera uttrycken INSERT, UPDATE och DELETE är att kolumnerna i uttrycken INSERT och UPDATE baseras på de kolumner som returneras av instruktionen SELECT. Vi kan dock behöva uppdatera eller infoga fler eller färre fält. I exemplet från steg 2 kanske vi vill att UnitPrice BoundField ska vara skrivskyddat. I så fall bör den inte visas i UpdateCommand. Eller så kanske vi vill ange värdet för ett tabellfält som inte visas i GridView. När du till exempel lägger till en ny post kan vi vilja att värdet QuantityPerUnit ska sättas till TODO.
Om sådana anpassningar krävs måste du göra dem manuellt, antingen via fönstret Egenskaper, alternativet Ange en anpassad SQL-instruktion eller lagrad procedur i guiden eller via deklarativ syntax.
Anmärkning
När du lägger till parametrar som inte har motsvarande fält i datawebbkontrollen bör du tänka på att dessa parametrar måste tilldelas värden på något sätt. Dessa värden kan vara: hårdkodade direkt i InsertCommand eller UpdateCommand; kan komma från någon fördefinierad källa (frågesträngen, sessionstillståndet, webbkontroller på sidan och så vidare), eller kan tilldelas programmatiskt, som vi såg i föregående självstudie.
Sammanfattning
För att datawebbkontrollerna ska kunna använda sina inbyggda infognings-, redigerings- och borttagningsfunktioner måste datakällans kontroll som de är bundna till erbjuda sådana funktioner. För SqlDataSource innebär det att INSERT, UPDATEoch DELETE SQL-uttryck måste tilldelas egenskaperna InsertCommand, UpdateCommandoch DeleteCommand . Dessa egenskaper och motsvarande parametersamlingar kan läggas till manuellt eller genereras automatiskt via guiden Konfigurera datakälla. I den här handledningen undersökte vi båda teknikerna.
Vi har undersökt att använda optimistisk samtidighet med ObjectDataSource i handledningen Implementera optimistisk samtidighet. SqlDataSource-kontrollen ger också optimistisk samtidighetsstöd. Som noterat i steg 2 erbjuder guiden alternativet Använd optimistisk samtidighet när INSERT, UPDATE och DELETE-instruktionerna genereras automatiskt. Som vi kommer att se i nästa självstudie, innebär användning av optimistisk samtidighet med SqlDataSource att WHERE-klauserna i UPDATE- och DELETE-instruktionerna ändras för att säkerställa att värdena för de andra kolumnerna inte har ändrats sedan datan senast visades på sidan.
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.