C# - MS SQL 2000 újdonsága: lekérdezés XML formátumba

XML 7. rész

forráskód letöltése
Az MS SQL 2000-es verziójától kezdve lehetőséget biztosít arra, hogy egy-egy Select lekérdezésünk eredményét közvetlenül XML-ben kapjuk meg. Hogy az így kapott eredményt mire használjuk az már csak feladatunktól, illetve fantáziánktól függ.
Mielőtt használhatnánk ezen lehetőségét az MS SQL szervernek, előtte azt konfigurálnunk kell. Ehhez tegyük a következő lépéseket:
  • Start menü - Microsoft SQL Server program csoport, ezen belül indítsuk el a Configure SQL XML Support in IIS programot.
  • Keressük elő a hierarchiából azt a szervert és azon belül azt a web site-ot, melyhez az XML támogatást létre kívánjuk hozni.
  • Válasszuk az Action - New - Virtual Directory menüpontot.
  • A General lapon adjuk meg a virtuális könyvtárunk nevét a Virtual Directory Name mezőben. Ez a név tetszőleges lehet. Ha például itt a Northwind szót adjuk meg, akkor majd így indíthatunk egy lekérdezést: http://www.xy.hu/Northwind?sql=… A Local Path-ban a fizikai elérési útvonalat adjuk meg, ez legyen a C:\Inetpub\wwwroot\Northwind, melyet nekünk kell létrehozni.
  • Hozzuk még létre a C:\Inetpub\wwwroot\Northwind\Schema és C:\Inetpub\wwwroot\Northwind\Template alkönyvtárakat, melyekre később még szükségünk lesz.
  • A következő Security lapon adjunk meg egy érvényes bejelentkezési nevet és jelszót, melyet a lekérdezésekhez szeretnénk használni.
  • A DataSource lapon válasszuk ki a használni kívánt SQL szervert és ezen belül az elérni kívánt adatbázist, mely most legyen a Northwind példa adatbázis.
  • A Settings lapon engedélyezzük az összes lehetőséget.
  • A Virtual Names lapon kattintsunk a New gombra
  • A megjelenő ablakban a Virtual Name mezőbe írjuk be, hogy dbobject a Type legyen dbobject, majd Save.
  • Ismét a New gomb.
  • A megjelenő ablakban a Virtual Name mezőbe írjuk be, hogy schema a Type legyen schema, a Path legyen C:\Inetpub\wwwroot\Northwind\Schema, majd Save.
  • Ismét a New gomb.
  • A megjelenő ablakban a Virtual Name mezőbe írjuk be, hogy template a Type legyen template, a Path legyen C:\Inetpub\wwwroot\Northwind\Template, majd Save.
  • Végül az OK gomb.
A konfigurálást ezzel be is fejeztük, tegyünk próbaképpen egy ellenőrzést: indítsuk el az Internet Explorert és a címsorba írjuk a következőt: http://www.xy.hu/Northwind?sql=SELECT * FROM Products FOR XML AUTO&root=product. Az www.xy.hu helyére persze saját web címét írja. Eredményként egy nagy adag XML-t kell kapnunk a böngészőbe.
Nézzük most azt, hogy miként tudjuk felhasználni ezt a lehetőséget programból.
A példában egy tetszőleges select utasítást futtathatunk. Ehhez egy programból történő webes kérést kell kiadnunk, melyhez a GetWebContent belső függvényünket használjuk. Ennek paraméterként egy sztringbe kell megadnunk azt az URL-t melyet szeretnénk elérni, majd visszatérési értékként egy sztringbe kapjuk az eredményt. A függvény működését részletesen a múlt héten bemutatott „Web lap letöltése tetszőleges címről HTML-ben” című cikkben ismertettük.
Ahhoz, hogy a lekérdezés eredményét XML-ben kapjuk meg az SQL szervertől, a FOR XML záradék használatára van szükség egy SELECT végén. Így a futtatáshoz összeállítjuk a megfelelő URL-t, majd a GetWebContent függvénnyel futtatjuk azt és az eredményt a textBox4-ben tároljuk.
    private void button1_Click(object sender, System.EventArgs e)
    {
      textBox4.Text = GetWebContent("http://" + textBox1.Text + "/" + textBox2.Text + "?sql=" + textBox3.Text + " FOR XML AUTO&root=items");      
A kapott eredmény feldolgozásához egy XmlDocument osztályt használunk, melybe a kapott eredményt a LoadXml függvénnyel töltjük be. Megjelenítéshez az UpdateList belső függvényünket használjuk.
      xd.LoadXml(textBox4.Text);
      UpdateList();   
    }
Az UpdateList függvény annyit tesz, hogy kiolvas egy „rekordot” a kapott eredményből majd azt megjeleníti a listBox1-ben. Mivel létrehoztunk egy globális int típusú counter nevű változót, valamint ehhez két nyomógombot, mellyel növelni, illetve csökkenteni lehet az értékét, így lehetőségünk van, hogy mindig csak egy rekord jelenjen meg a lekérdezés eredményéből és ezt lapozhassuk előre, hátra.
    private void UpdateList()
    {
      listBox1.Items.Clear();
      foreach (XmlAttribute xa in xd.DocumentElement.ChildNodes[counter].Attributes)
      {
        listBox1.Items.Add(xa.Name + ": " + xa.Value);
      }        
    }

XML felhasználása C#-ban cikksorozat