Dela via


Ställa frågor till data med SqlDataSource-kontrollen (C#)

av Scott Mitchell

Ladda ned PDF

I de föregående självstudierna använde vi ObjectDataSource-kontrollen för att helt separera presentationslagret från dataåtkomstlagret. Från och med den här självstudien får vi lära oss hur SqlDataSource-kontrollen kan användas för enkla program som inte kräver en sådan strikt uppdelning av presentation och dataåtkomst.

Inledning

Alla handledningar som vi har granskat hittills har använt en lagerindelad arkitektur som består av presentationslagret, affärslogiklagret och dataåtkomstlagret. Dataåtkomstlager (DAL) skapades i den första självstudien (Skapa ett dataåtkomstlager) och affärslogiklagret i den andra (Skapa ett affärslogiklager). Från och med självstudien Visa data med ObjectDataSource såg vi hur du använder ASP.NET 2.0:s nya ObjectDataSource-kontroll för att deklarativt koppla till arkitekturen från presentationslagret.

Även om alla handledningar hittills har använt arkitekturen för att arbeta med data, är det också möjligt att nå, lägga till, ändra och ta bort data i databasen direkt från en ASP.NET-webbsida och kringgå arkitekturen. Detta placerar de specifika databasfrågorna och affärslogik direkt på webbsidan. För tillräckligt stora eller komplexa program är det mycket viktigt att utforma, implementera och använda en nivåindelad arkitektur för att programmet ska lyckas, uppdateras och underhållas. Det kan dock vara onödigt att utveckla en robust arkitektur när du skapar mycket enkla engångsprogram.

ASP.NET 2.0 innehåller fem inbyggda datakällkontroller SqlDataSource, AccessDataSource, ObjectDataSource, XmlDataSource och SiteMapDataSource. SqlDataSource kan användas för att komma åt och ändra data direkt från en relationsdatabas, inklusive Microsoft SQL Server, Microsoft Access, Oracle, MySQL och andra. I den här självstudien och de kommande tre ska vi undersöka hur du arbetar med SqlDataSource-kontrollen och utforskar hur du frågar efter och filtrerar databasdata samt hur du använder SqlDataSource för att infoga, uppdatera och ta bort data.

ASP.NET 2.0 innehåller fem Built-In datakällakontroller

Bild 1: ASP.NET 2.0 innehåller fem Built-In datakällans kontroller

Jämföra ObjectDataSource och SqlDataSource

Konceptuellt är både ObjectDataSource- och SqlDataSource-kontrollerna helt enkelt proxyservrar till data. Som beskrivs i självstudien Visa data med ObjectDataSource har ObjectDataSource egenskaper som anger den objekttyp som innehåller data och de metoder som ska anropas för att välja, infoga, uppdatera och ta bort data från den underliggande objekttypen. När Egenskaperna för ObjectDataSource har konfigurerats kan en datawebbkontroll, till exempel en GridView, DetailsView eller DataList, bindas till kontrollen med hjälp av ObjectDataSources Select(), Insert(), Delete()och Update() metoder för att interagera med den underliggande arkitekturen.

SqlDataSource har samma funktioner, men fungerar mot en relationsdatabas i stället för ett objektbibliotek. Med SqlDataSource måste vi ange databasanslutningssträngen och de ad hoc SQL-frågor eller lagrade procedurer som ska köras för att infoga, uppdatera, ta bort och hämta data. SqlDataSources Select(), Insert(), Update()och Delete() -metoder, när de anropas, ansluter till den angivna databasen och utfärdar lämplig SQL-fråga. Som följande diagram illustrerar utför de här metoderna grunt-arbetet med att ansluta till en databas, utfärda en fråga och returnera resultaten.

SqlDataSource fungerar som en proxy till databasen

Bild 2: SqlDataSource fungerar som en proxy till databasen

Anmärkning

I den här handledningen fokuserar vi på att hämta data från databasen. I självstudien Infoga, Uppdatera och Ta bort data med SqlDataSource Control ser vi hur du konfigurerar SqlDataSource för att stödja infogning, uppdatering och borttagning.

Kontrollerna SqlDataSource och AccessDataSource

Förutom SqlDataSource-kontrollen innehåller ASP.NET 2.0 även en AccessDataSource-kontroll. Dessa två olika kontroller gör att många utvecklare som är nya i ASP.NET 2.0 misstänker att AccessDataSource-kontrollen är utformad för att fungera exklusivt med Microsoft Access med SqlDataSource-kontrollen utformad för att fungera exklusivt med Microsoft SQL Server. AccessDataSource är utformat för att fungera specifikt med Microsoft Access, men SqlDataSource-kontrollen fungerar med alla relationsdatabaser som kan nås via .NET. Detta omfattar alla OleDb- eller ODBC-kompatibla datalager, till exempel Microsoft SQL Server, Microsoft Access, Oracle, Informix, MySQL och PostgreSQL, bland många andra.

Den enda skillnaden mellan kontrollerna AccessDataSource och SqlDataSource är hur databasanslutningsinformationen anges. AccessDataSource-kontrollen behöver endast sökvägen till Access-databasfilen. SqlDataSource kräver å andra sidan en fullständig anslutningssträng.

Steg 1: Skapa SqlDataSource-webbsidor

Innan vi börjar utforska hur du arbetar direkt med databasdata med hjälp av SqlDataSource-kontrollen, låt oss först ta en stund att skapa de ASP.NET-sidor i vårt webbplatsprojekt som vi behöver för den här självstudien och de kommande tre. Börja med att lägga till en ny mapp med namnet SqlDataSource. Lägg sedan till följande ASP.NET sidor i mappen och se till att associera varje sida med Site.master huvudsidan:

  • Default.aspx
  • Querying.aspx
  • ParameterizedQueries.aspx
  • InsertUpdateDelete.aspx
  • OptimisticConcurrency.aspx

Lägg till ASP.NET-sidorna för SqlDataSource-Related-tutorials

Bild 3: Lägg till ASP.NET-sidorna för SqlDataSource-Related-handledningarna

Precis som i de andra mapparna kommer Default.aspx i SqlDataSource-mappen att lista självstudierna i dess avsnitt. Kom ihåg att SectionLevelTutorialListing.ascx användarkontrollen innehåller den här funktionen. Lägg därför till den här användarkontrollen genom att Default.aspx dra den från Solution Explorer till sidans designvy.

Lägg till sectionLevelTutorialListing.ascx-användarkontrollen i Default.aspx

Bild 4: Lägg till SectionLevelTutorialListing.ascx användarkontrollen Default.aspx i (Klicka om du vill visa en bild i full storlek)

Slutligen lägger du till dessa fyra sidor som poster i Web.sitemap filen. Mer specifikt lägger du till följande markering efter att du har lagt till anpassade knappar i DataList och Repeater <siteMapNode>:

<siteMapNode url="~/SqlDataSource/Default.aspx"
    title="Using the SqlDataSource Control"
    description="Work directly with database data using the SqlDataSource control.">
    <siteMapNode url="~/SqlDataSource/Querying.aspx" title="Retrieving Database Data"
        description="Examines how to query data from a database that can then be
                     displayed  through a data Web control."/>
    <siteMapNode url="~/SqlDataSource/ParameterizedQueries.aspx"
        title="Parameterized Queries"
        description="Learn how to specify parameterized WHERE clauses in the
                     SqlDataSource's SELECT statement." />
    <siteMapNode url="~/SqlDataSource/InsertUpdateDelete.aspx"
        title="Inserting, Updating, and Deleting Database Data"
        description="See how to configure the SqlDataSource to include INSERT, UPDATE,
                      and DELETE statements." />
    <siteMapNode url="~/SqlDataSource/OptimisticConcurrency.aspx"
        title="Using Optimistic Concurrency"
        description="Explore how to augment the SqlDataSource to include support for
                     optimistic concurrency." />
</siteMapNode>

Efter att du har uppdaterat Web.sitemap, ta en stund att besöka självstudiewebbplatsen via en webbläsare. Menyn till vänster innehåller nu alternativ för redigering, infogning och borttagning av handledningar.

Webbplatsöversikten innehåller nu element för

Bild 5: Webbplatsöversikten innehåller nu poster för SqlDataSource-handledningarna

Steg 2: Lägga till och konfigurera SqlDataSource-kontrollen

Börja med att Querying.aspx öppna sidan i SqlDataSource mappen och växla till designvyn. Dra en SqlDataSource-kontroll från verktygslådan till designern och ställ in den IDProductsDataSource. Precis som med ObjectDataSource producerar SqlDataSource inte några renderade utdata och visas därför som en grå ruta på designytan. Om du vill konfigurera SqlDataSource klickar du på länken Konfigurera datakälla från SqlDataSources smarta tagg.

Klicka på länken Konfigurera datakälla från Smart Tag i SqlDataSource

Bild 6: Klicka på länken Konfigurera datakälla från SqlDataSources smarta tagg

Då visas guiden Konfigurera datakälla i SqlDataSource-kontrollen. Även om stegen i guiden skiljer sig från ObjectDataSource-kontrollen är slutmålet detsamma för att ge information om hur du hämtar, infogar, uppdaterar och tar bort data via datakällan. För SqlDataSource innebär detta att du anger den underliggande databas som ska användas och tillhandahåller ad hoc SQL-instruktioner eller lagrade procedurer.

I det första guidesteget uppmanas vi att ange databasen. Listrutan innehåller de databaser som finns i webbprogrammets App_Data mapp och de som har lagts till i noden Dataanslutningar i Serverutforskaren. Eftersom vi redan har lagt till en anslutningssträng för NORTHWIND.MDF databasen i mappen i App_Data projektfilen Web.config innehåller listrutan en referens till anslutningssträngen. NORTHWINDConnectionString Välj det här objektet i listrutan och klicka på Nästa.

Välj NORTHWINDConnectionString från Drop-Down-listan

Bild 7: Välj från NORTHWINDConnectionString listan Drop-Down

Efter att du har valt databasen ber guiden dig att ange en fråga som returnerar data. Vi kan antingen ange kolumnerna i en tabell eller vy som ska returneras eller ange en anpassad SQL-instruktion eller ange en lagrad procedur. Du kan växla mellan dessa val genom att ange en anpassad SQL-instruktion eller lagrad procedur och ange kolumner från en tabell eller vy med hjälp av radio-knappar.

Anmärkning

I det här första exemplet ska vi använda alternativet Ange kolumner från en tabell eller vy. Vi går tillbaka till guiden senare i den här självstudien och utforskar alternativet Ange en anpassad SQL-instruktion eller lagrad procedur.

Bild 8 visar skärmen för att konfigurera kommandot Select då valet radioknappen Ange kolumner från en tabell eller vy är markerad. Rullgardinslistan innehåller uppsättningen av tabeller och vyer i Northwind-databasen, med de valda tabellens eller vyernas kolumner som visas i kryssruta-listan nedan. I det här exemplet returnerar vi kolumnerna ProductID, ProductNameoch UnitPrice från Products tabellen. Som bild 8 visar visar guiden den resulterande SQL-instruktionen SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]när du har gjort de här valen.

Returnera data från produkttabellen

Bild 8: Returnera data från tabellen Products

När du har konfigurerat guiden för att returnera kolumnerna ProductID, ProductNameoch UnitPrice från Products tabellen klickar du på knappen Nästa. Den här sista skärmen ger en möjlighet att undersöka resultatet av frågan som konfigurerades från föregående steg. När du klickar på knappen Testa fråga körs den konfigurerade SELECT instruktionen och resultatet visas i ett rutnät.

Klicka på knappen Testa fråga för att granska din SELECT-fråga

Bild 9: Klicka på knappen Testa fråga för att granska din SELECT fråga

Färdigställ guiden genom att klicka på Slutför.

Precis som med ObjectDataSource tilldelar guiden SqlDataSource bara värden till kontrollens egenskaper, nämligen ConnectionString-egenskapen och SelectCommand-egenskapen. När du har slutfört guiden bör sqlDataSource-kontrollens deklarativa markering se ut ungefär så här:

<asp:SqlDataSource ID="ProductsDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]">
</asp:SqlDataSource>

Egenskapen ConnectionString innehåller information om hur du ansluter till databasen. Den här egenskapen kan tilldelas ett fullständigt, hårdkodat anslutningssträngsvärde eller peka på en anslutningssträng i Web.config. Om du vill referera till ett anslutningssträngsvärde i Web.configanvänder du syntaxen <%$ expressionPrefix:expressionValue %>. Normalt är expressionPrefix ConnectionStrings och expressionValue är namnet på anslutningssträngen Web.config<connectionStrings> i avsnittet. Syntaxen kan dock användas för att referera <appSettings> till element eller innehåll från resursfiler. Mer information om den här syntaxen finns i översikten över ASP.NET uttryck .

Egenskapen SelectCommand anger den ad hoc SQL-instruktion eller lagrade procedur som ska köras för att returnera data.

Steg 3: Lägga till en datawebbkontroll och binda den till SqlDataSource

När SqlDataSource har konfigurerats kan den bindas till en datawebbkontroll, till exempel en GridView eller DetailsView. I den här självstudien ska vi visa data i en GridView. Från verktygslådan drar du en GridView till sidan och binder den till ProductsDataSource SqlDataSource genom att välja datakällan från listrutan i GridViews smarta tagg.

Lägg till en GridView och bind den till SqlDataSource-kontrollen

Bild 10: Lägg till en GridView och bind den till SqlDataSource-kontrollen (Klicka om du vill visa en bild i full storlek)

När du har valt SqlDataSource-kontrollen från listrutan i GridViews smarta tagg lägger Visual Studio automatiskt till ett BoundField- eller CheckBoxField-objekt i GridView för var och en av kolumnerna som returneras av datakällkontrollen. Eftersom SqlDataSource returnerar tre databaskolumner ProductID, ProductName, och UnitPrice det finns tre fält i GridView.

Ta några minuter för att konfigurera de tre BoundFields i GridView. ProductName Ändra fältets HeaderText egenskap till Produktnamn och fälten UnitPrice till Pris. Formatera även fältet UnitPrice som en valuta. När du har gjort de här ändringarna bör deklarativ markering för GridView se ut ungefär så här:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
    EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ProductID" HeaderText="ProductID"
            InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="Product Name"
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" HeaderText="Price"
            SortExpression="UnitPrice" DataFormatString="{0:c}"
            HtmlEncode="False" />
    </Columns>
</asp:GridView>

Besök den här sidan via en webbläsare. Som bild 11 visar visar GridView varje produkts ProductID, ProductNameoch UnitPrice värden.

GridView visar varje produkts ProductID-, ProductName- och UnitPrice-värden

Bild 11: GridView visar varje produkts ProductID, ProductNameoch UnitPrice värden (Klicka om du vill visa en bild i full storlek)

När sidan besöks anropar GridView datakällans Select() kontrollmetod. När vi använde ObjectDataSource-kontrollen, kallades den ProductsBLL klassens GetProducts()-metod. Med SqlDataSource upprättar metoden dock Select() en anslutning till den angivna databasen och utfärdar SelectCommand (SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]i det här exemplet). SqlDataSource returnerar sina resultat som GridView sedan räknar upp och skapar en rad i GridView för varje databaspost som returneras.

Funktionerna för Built-In:s datanätkontroll och SqlDataSource-kontrollen

I allmänhet är de funktioner som är inbyggda i datawebbkontrollerna växling, sortering, redigering, borttagning, infogning och så vidare specifika för datawebbkontrollen och är inte beroende av den datakällakontroll som används. Det vill säga, GridView kan använda sin inbyggda bläddring, sortering, redigering och borttagning oavsett om den är bunden till en ObjectDataSource eller en SqlDataSource. Vissa funktioner för datawebbkontroll är dock känsliga för den datakällkontroll som används eller för konfigurationen av datakällkontrollen.

I självstudien Effektiv växling genom stora mängder data diskuterade vi till exempel hur växlingslogik för datawebbkontrollerna som standard naivt returnerar alla poster från den underliggande datakällan och sedan endast visar lämplig delmängd av poster med tanke på det aktuella sidindexet och antalet poster som ska visas per sida. Den här modellen är mycket ineffektiv när man bläddrar igenom tillräckligt stora resultatuppsättningar. Som tur är kan ObjectDataSource konfigureras för att stödja anpassad sidindelning, som endast returnerar den exakta delmängden av poster som ska visas. SqlDataSource-kontrollen saknar dock egenskaperna för att implementera anpassad sidindelning.

En annan subtilitet med paginering och sortering uppstår med SqlDataSource. Som standard kan data som returneras från en SqlDataSource bläddras eller sorteras via GridView. Om du vill visa detta markerar du alternativen Aktivera sidindelning och Aktivera sortering i GridViews smarta tagg i Querying.aspx och verifierar att detta fungerar som förväntat.

Sortering och paginering fungerar eftersom SqlDataSource hämtar databasdata till en DataSet med löst typsystem. Det totala antalet poster som returneras av frågan är en viktig aspekt för att implementera paginering och kan fastställas från DataSet. Dessutom kan DataSet-resultaten sorteras via en DataView. Dessa funktioner används automatiskt av SqlDataSource när GridView begär växlat eller sorterat data.

SqlDataSource kan konfigureras för att returnera en DataReader istället för en Dataset genom att ändra dessDataSourceMode egenskap från DataSet (standard) till DataReader. Att använda en DataReader kan vara att föredra i situationer när sqlDataSource-resultatet skickas till befintlig kod som förväntar sig en DataReader. Eftersom DataReaders är betydligt enklare objekt än DataSets ger de dessutom bättre prestanda. Om du gör den här ändringen kan dock datawebbkontrollen varken sortera eller paginera, eftersom SqlDataSource inte kan fastställa hur många poster som returneras av frågan, och inte heller erbjuder DataReader några tekniker för att sortera den returnerade datan.

Steg 4: Använda en anpassad SQL-instruktion eller lagrad procedur

När du konfigurerar SqlDataSource-kontrollen kan frågan som används för att returnera data anges i någon av två metoder som en anpassad SQL-instruktion eller lagrad procedur, eller som kolumner från en befintlig tabell eller vy. I steg 2 undersökte vi att välja kolumner från Products tabellen. Låt oss titta på hur du använder en anpassad SQL-instruktion.

Lägg till ytterligare en GridView-kontroll på Querying.aspx sidan och välj att skapa en ny datakälla från listrutan i den smarta taggen. Ange sedan att data hämtas från en databas, vilket skapar en ny SqlDataSource-kontroll. Ge namnet till kontrollen ProductsWithCategoryInfoDataSource.

Skapa en ny SqlDataSource-kontroll med namnet ProductsWithCategoryInfoDataSource

Bild 12: Skapa en ny SqlDataSource-kontroll med namnet ProductsWithCategoryInfoDataSource

Nästa skärm ber oss att ange databasen. Precis som vi gjorde i bild 7 väljer du NORTHWINDConnectionString från listrutan och klickar på Nästa. På skärmen Konfigurera välj instruktion väljer du alternativknappen Ange en anpassad SQL-instruktion eller lagrad procedur och klickar på Nästa. Då visas skärmen Definiera anpassade instruktioner eller Lagrade procedurer, som erbjuder flikar märkta SELECT, UPDATE, INSERT och DELETE. På varje flik kan du ange en anpassad SQL-instruktion i textrutan eller välja en lagrad procedur i listrutan. I den här självstudien ska vi titta på hur du anger en anpassad SQL-instruktion. nästa självstudie innehåller ett exempel som använder en lagrad procedur.

Ange en anpassad SQL-instruktion eller välj en lagrad procedur

Bild 13: Ange en anpassad SQL-instruktion eller välj en lagrad procedur

Den anpassade SQL-instruktionen kan anges för hand i textrutan eller skapas grafiskt genom att klicka på knappen Query Builder. Från antingen Query Builder eller textrutan, använd följande fråga för att returnera fälten ProductID och ProductName från tabellen Products med hjälp av en JOIN för att hämta produktens CategoryName från tabellen Categories.

SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
FROM Categories
    INNER JOIN Products ON
        Categories.CategoryID = Products.CategoryID

Du kan skapa frågan grafiskt med frågeverktyget

Bild 14: Du kan skapa frågan grafiskt med frågeverktyget

När du har angett frågan klickar du på Nästa för att fortsätta till skärmen Testa fråga. Klicka på Slutför för att slutföra guiden SqlDataSource.

När du har slutfört guiden kommer GridView att ha tre BoundFields som visar kolumnerna ProductID, ProductName och CategoryName vilka returneras från frågan och resulterar i följande deklarativa markering.

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ProductID" DataSourceID="ProductsWithCategoryInfoDataSource"
    EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="ProductID" HeaderText="ProductID"
            InsertVisible="False" ReadOnly="True" SortExpression="ProductID" />
        <asp:BoundField DataField="ProductName" HeaderText="ProductName"
            SortExpression="ProductName" />
        <asp:BoundField DataField="CategoryName" HeaderText="CategoryName"
            SortExpression="CategoryName" />
    </Columns>
</asp:GridView>
<asp:SqlDataSource ID="ProductsWithCategoryInfoDataSource" runat="server"
    ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
    SelectCommand="
        SELECT Products.ProductID, Products.ProductName, Categories.CategoryName
        FROM Categories
        INNER JOIN Products ON Categories.CategoryID = Products.CategoryID">
</asp:SqlDataSource>

GridView visar varje produkts ID, namn och tillhörande kategorinamn

Bild 15: GridView visar varje produkts ID, namn och tillhörande kategorinamn (klicka om du vill visa en bild i full storlek)

Sammanfattning

I den här handledningen såg vi hur man frågar efter och visar data med hjälp av SqlDataSource-kontrollen. Precis som ObjectDataSource fungerar SqlDataSource som en proxy, vilket ger en deklarativ metod för att komma åt data. Dess egenskaper anger vilken databas som ska anslutas till och SQL-frågan SELECT som ska köras. De kan anges via fönstret Egenskaper eller med hjälp av guiden Konfigurera DataSource.

Frågeexemplen SELECT som vi undersökte i denna handledning returnerade alla poster från den angivna frågan. SqlDataSource-kontrollen kan dock innehålla en WHERE sats med parametrar vars värden tilldelas programmatiskt eller hämtas automatiskt från en angiven källa. Vi ska undersöka hur du skapar och använder parametriserade frågor i nästa självstudie!

Lycka till med programmerandet!

Ytterligare läsning

Mer information om de ämnen som beskrivs i den här självstudien finns i följande resurser:

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 Susan Connery, Bernadette Leigh och David Suru. Vill du granska mina kommande MSDN-artiklar? Om så är fallet, hör av dig på mitchell@4GuysFromRolla.com.