Stored procedures, XML og ASP.NET

Tags:    .net asp.net
Skrevet af Bruger #2730 @ 02.05.2004
Navnet på denne artikel siger måske ikke det hele omkring hvad der vil blive vist i denne artikel, men igen en mere detaljeret overskrift vil nok virke mere forvirrende. Denne artikel vil gennemgå forskellige aspekter af det at bruge C#, SQL, XML samt XSLT til at opnå nogle virkelig gode resultater, både rent performance mæssige men også rent designmæssigt. I denne artikel vil jeg lave et lille eksempel på at fylde en drop down boks ud med værdier fra en database. Umiddelbart lyder dette som den mest simple ting, men der er mere i det end som så. Denne teknologi er enormt tidsbesparende og ekstremt hurtigt til alle emner indenfor web udvikling og ikke kun til at bygge en Drop down boks. Hele denne artikel vil bygge på Visual Studio .NET, sp brugere der ikke benytter dette produkt, må tilpasse artiklen til deres udviklingsmiljø. Jeg vil gennemgå følgende emner i denne artikel:

* Bygge en stored procedure i SQL Server
* Få denne stored procedure til at returnere resultatsættet som XML
* Lave et Xml dokument ud fra dette resultatsæt
* Lave et XSLT dokument til at formattere xml dokumentet
* Placere en Xml web form i min applikation samt konfigurere denne til at benytte mit stylesheet og mit xml dokument

Lave en stored procedure


Det første der skal laves i vores lille web applikation er en stored procedure der skal returnere alle de kunder der findes i vores 'Northwind' database ('Northwind' er en demo database der kommer standard med SQL Serveren). Syntaksen for at lave en stored procedure i SQL Server 2000 er meget som at oprette et hvilket som helst objekt i databasen, med 'create' kommandoen efter fulgt af den statement der skal eksekveres og til sidst angives de constraints eller options der skal benyttes. For at lave en Stored procedure i vores database der returnerer alle de kunder der findes i vores demo database laver og eksekverer vi en T-SQL Statement der ser således ud:

Fold kodeboks ind/udKode 


Denne meget simple stored procedure består egentligt kun at en linie der fortæller SQL Serveren at den nu skal lave en stored procedure der hedder getCustomers. De næste par linier fortæller SQL Serveren at den Stored Procedure skal bestå af en SQL Statement der udvælger alle firmanavne fra customers. Ikke noget hokus pokus endnu. For en god ordens skyld vil jeg lige nævne at hvis man er kommet til at lave noget forkert kan man altid droppe eller ændre sin store procedure ved at bruge enten 'drop' eller 'alter' i stedet for create. For nu at kontrollere at vores stored procedure eksisterer kan vi i Enterprise manageren til SQL Serveren folde den mappe ud der hedder 'Stored procedures' og se at vores nyoprettede stored procedure er i blandt dem der listes.



Vi vil nu gerne teste om vores stored procedure så også returnerer alle de kunder vi vil have i vores applikation. Dette gøres meget simpelt ved simpelthen i Query analyseren at skrive navnet på vores stored procedure og eksekvere denne. Dette vil aktivere vores stored procedure og den vil returnere det et resultatsæt.



Som forventet har vi det fulde resultatsæt til rådighed. Helt generelt ville vi i dette tilfælde kunne opnå det samme uden at lave en stored procedure, men det er meget praktisk at benytte stored procedures således man kan indkapsle sin SQL kode til SQL Serveren og benytte de fordele der er ved stored procedures. Nu hvor den stored procedure returnerer de kunder vi gerne vil have fat i vil vi udbygge den stored procedure til at kunne returnere resultatsættet som XML i stedet for som et standard resultatsæt. Dette gør vi ved at ændre den Stored Procedure vi netop har lavet til at se inkludere en 'for xml' klausul.

Fold kodeboks ind/udKode 


Bemærk at vi ikke laver en ny stored procedure men blot ændrer den eksisterende stored procedure til at indeholde en ekstra linie. Den ekstra linie fortæller SQL Serveren at den skal returnere resultatet som xml og at den automatisk skal arrangere kolonnerne som nodes. Hvis vi kører vores stored procedure efter denne ændring vil vi se at der ikke længere kommer et standard resultatsæt, men nogle linier der indeholder XML, hvilket er hvad vi vil opnå.



Så er den stored procedure på plads og nu skal vi blot have lavet noget kode der kan kommunikere med SQL Serveren, eksekvere den stored procedure, samle resultatet op og formattere det som en drop down. Det eneste der bare lige står i vejen er at vi sikkert ikke har rettigheder til at køre den stored procedure fra vores ASP.NET applikation. Det vi skal huske på er at når vi er logget ind på SQL Serveren så er det typisk som dbo (DataBase Owner) det betyder at vi også har oprettet den stored procedure med denne ejer, kigger vi efter i SQL Serveren igen vil vi se at den stored procedure rent faktisk hedder dbo.getCustomers. Når en Web applikation skal logge inde på sql serveren skal den naturligvis have rettigheder. Den bruger den logger ind som hedder ASPNET og er en lokal konto på maskinen, derfor skal vi lige give denne bruger rettigheder til at forespørge databasen. Dette gøres ved at gå ind i 'users' mappen i SQL Serverens Enterprise Manager og tilføje ASPNET brugeren som ejer af databasen, så kan den herefter få lov til alt.



Fra stored procedure til XML dokument i C#


Start Visual Studio .NET op og start med at lav et ASP.NET projekt.



I dette projekt skal der laves en ny klasse der holder alt information omkring databaseforbindelse samt den funktionalitet der skal udføres i programmet. Men for nemheds skyld vil vi ikke lave denne ekstra klasse, men blot (imod alle regler for design) lave funktionalitet og database forbindelse i vores grænseflade. Start med at tilføje et par ekstra 'using' klausuler således vi er i stand til at arbejde med xml og til at forbinde til databasen. Tilføj disse tolinier øverst i koden:

Fold kodeboks ind/udKode 


lave en ny metode der hedder getCustomers(). Denne metode er den der vil forbinde til dtabasen og trække data fra vores stored procedure. Metoden skal returnere et XmlDocument. Den kan se ud som nedenstående:

Fold kodeboks ind/udKode 


Der er tre dele i denne metode. Den første del er selve det at oprette en forbindelse til databasen samt åbne forbindelse. Den anden del er at lave en SqlCommand der indeholder de variable vi ønsker at bruge i eksekveringen af vores stored procedure. Det sidste der sker er at vi eksekverer vores SqlCommand og sender resultatet ind i en XmlReader. Nu skal vi lige huske på at når en SQL Server returnerer et resultatsæt som xml er det ikke lovligt da det ikke indeholder et rod element, dette tilføjer vi så lige til et tomt XmlDocument inden vi begynder at løbe alle de nodes igennem der findes i det returnerede xml dokument. Når alt dette er slut lukker vi forbindelsen til databasen igen og returnerer vores XmlDokument. Så skal vi have lavet noget mere design. Gå tilbage til design view i den ASP.NET applikation vi er ved at udvikle og tilføj en Xml web form til siden (jeg har også lavet en overskrift).



Det næste skridt vi skal have taget er at assigne vores XmlDocument til den Xml web form vi netop har tilføjet vores web applikation. Dette er heldigvis meget nemt, tilføj næste linie i din page_load event:

Fold kodeboks ind/udKode 


Stylesheet til formattering


Næste trin er at få lavet det stylesheet der skal bruges til at lave vores drop down boks med. Men som de fleste sikkert ved så er det lidt svært (for ikke at sige umuligt) at lave et stylesheet i blinde, uden at kende det xml dokument man skal ramme. Dette løser vi nemt ved at udvidde vores getCustomers() metode midlertidig med en enkelt linie der gemmer vores XmlDocument i en fil vi så kan forholde os til mens vi bygger vores stylesheet. Følgende linie tilføjes mellem 'close' og 'return' således de tre nederste linier ser således ud

Fold kodeboks ind/udKode 


Dette giver os et nyt problem, vi har ikke rettighed til at skrive i dette bibliotek, så vi er nødt til at gå ind i sikkerhedsopsætningen for mappen vi gemmer vores applikation i (typisk noget i retning af: c:\\inetpub\\wwwroot\\...) og så giv midlertidig rollen 'Everyone' 'Full control'. Hvis vi kører vores applikation nu ser vi at der ikke sker noget.



Men vi har jo heller ikke formatteret noget endnu, men denne kørsel har heldigvis genereret et Xml dokument til os, som vi vil bruge når der skal laves et XSLT til brug ved formattering af vores Xml resultat.



Ud fra dette xml dokument kan vi hurtigt bygge et nyt stylesheet. Tilføj nu et nyt XSLT til løsningen, kald det for customers.xslt, og skriv følgende kode i dette stylesheet.

Fold kodeboks ind/udKode 


For at kunne formattere vores XmlDocument skal vi også assigne et stylesheet til vores Xml web form. Dette gøres ved at udvidde vores page_load event til at indeholde følgende::

Fold kodeboks ind/udKode 


Færdiggørelse samt test


Det var hurtigt overstået! HVis man kører applikationen nu vil man se en drop down boks der er fuldt populeret med data taget fra vores stored procedure i databasen. Husk igen på at dette er en meget simpelt eksempel på hvordan man kan bruge Stored Procedures, Xml, XSLT og ASP.NET i en større sammenhæng. Der er i princippet intet i vejen for at lave hele sider ud fra udtræk fra en SQL Server og så bare formattere det hele med et stylesheet, og hastigheden når først det er blevet compilet den er uden sammenligning.



Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (3)

User
Bruger #4968 @ 14.05.04 21:33
Hej Brian

Allerførst det er møj irriterende med de reklamer som dækker din indledning af en rigtig god artikel/indlæg.

Har god relevans,objektivitet og pædagogisk god sammenhæng i form af screen udsnit med
tilhørende forklaringer.
Giver god forståelse af nogle af de mange nye anvendelses mulighedder .NET giver "også for begyndere" Meget mere af den slags TAK !

Undertegnede skal derfor hermed også opfordre
dig til at lave en artikel tilsvarende i MySQL
da det synes at, dine kompetancer indenfor
MySQL området er stor" på grundlag af observerede afgivne svar her i forummet"
Det skal bemærkes at en sådan en artikel vedr.
MySQL må være af stor interesse da det er ikke alle som har økonimisk formåen til en msSQL server licens med tilhørende klient-licenser oven i vs.net licensen.
Og da der jo er mange "Tekniske handels hindringer " vedr .net & MySQL kunne kompetancer af den art du besidder være til gavn for de mange.
Ligeledes kunne udnyttelses mulighedderne i net
øges betragteligt for de mange! da nogle af mulighedderne er gået tabt hvis man ikke vil stå på 100% MS-produkterne

Mvh Jens


User
Bruger #123 @ 18.05.04 10:13
God artikel. Den viser nogle aspekter af Xml og MsSQL som mange måske ikke er klar over.

Mht. til den økonomiske side af MSSQL2000 serveren så finder der en personal edition af den ved navn MSDE 2000.

Den kan hentes her:
http://www.asp.net/msde/default.aspx?tabindex=0&tabid=1
User
Bruger #123 @ 18.05.04 11:48
Hovsa, der var lige en lille fejl på siden til msde downloaden . Det korrekte download link til MSDE er her:
http://www.microsoft.com/sql/msde/downloads/download.asp
Du skal være logget ind for at skrive en kommentar.
t