
A példához szükséges a XmlDb adatbázis, melyet a mellékelt resources mappában lévő XmlDb.sql parancsállomány lefuttatásával hozhatunk létre. Az XmlDb.sql script 5. sorában adja meg helyesen a létrehozandó adatbázisfájlok mappájának nevét és elérési útvonalát.
A program fordítása előtt referenciaként meg kell adni a felhasznált névteret. Ehhez válasszuk tehát Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a Microsoft.Data.SqlXml elemet.
Áttekintés
A Microsoft által elkészített névtér a Microsoft.Data.SqlXml nevet viseli, és cikkünk írásakor a következő Webcímen volt elérhető, mely természetesen megváltozhatott: http://msdn.microsoft.com/code/default.asp?url=/code/sample.asp?url=/msdn-files/027/001/824/msdncompositedoc.xml&frame=true.
Letöltve az állományt (sqlxml.msi) telepítenünk kell a .NET Framework alá. Az öntelepítő állomány erről gondoskodik, a használható .DLL állomány (Microsoft.Data.SqlXml.dll) alapértelmezésben a következő mappába kerül: %winroot%:\Program Files\SQLXML 3.0\bin\. Az MS SQL Server 2000 IIS-t konfiguráló, új beépülő modulját a %winroot%:\Program Files\SQLXML 3.0\ helyen érhetjük el. Ennek segítségével hozhatunk létre XML-t támogató virtuális könyvtárat Web-szerverünkön.
A telepített assembly bekerül a globális assembly listába, így amikor referenciaként megadjuk alkalmazásainkban, akkor a globális palettáról kell kiválasztanunk, nem pedig valamilyen alternatív mappából.
Az új névtér egy szervizcsomag részeként vált most felhasználhatóvá, azonban néhány hiba kiküszöbölése mellett sok hasznos funkcióval gazdagodott. Az új elemek nagy hangsúlyt fektetnek arra, hogy adatainkat speciális felépítésű XML állomány felhasználásával érjük el, illetve módosítsuk.
Ez az állomány lehet egy XML séma, mely leírja az adott tábla szerkezetét. Ugyanakkor bevezetésre került az úgynevezett Updategram-ok, illetve DiffGram-ok felhasználásának lehetősége, melyek speciális Template állományok meghatározott funkcionalitással.
Felépítésük az XML állományok struktúráját követi, azonban kötött elemeik révén nemcsak a kapcsolódó adatforrás szerkezetét írják le, hanem tartalmaznak elemeket az adatok módosításának mikéntjére is. A következő kódrészlet egy Updategram lehetséges felépítését mutatja, melynek felhasználásával egy meghatározott adatbázis Customers táblájába tudunk beszúrni egy új rekordot az állományban megadott adatokkal:
<ROOT xmlns:updg="urn:schemas-microsoft-com:xml-updategram">
<updg:sync >
<updg:before>
</updg:before>
<updg:after>
<Customers CustomerID="AAAAA" CompanyName="Bottom-Dollar Markets" />
</updg:after>
</updg:sync>
</ROOT>
Látható, hogy alapvetően három lényeges elemet tartalmaz. A <sync> elemek egy tranzakciónak felelnek meg, ebből több is lehet egy állományban. Köztük találunk párban egy <after> és egy <before> elemet. Az elvégzendő művelet attól függ, hogy milyen adatokat adunk meg ezekben, illetve melyet hagyjuk üresen.
Ha a <before> tagban megadott adatok alapján létező rekordot talál a feldolgozó, és az <after> tagban nem adunk meg semmit, akkor az adott rekord törlésre kerül.
Ha csak az <after> elemben adunk meg adatokat - ahogy példánkban tettük – és nem adunk meg semmit a <before> tagban, akkor INSERT művelet zajlik le a megadott adatokkal.
És természetesen, ha létező adatokra vonatkozó információkat adunk meg a két tagban, akkor az adott rekordon UPDATE művelet hajtódik végre.
A cikk következő szakaszában bemutatjuk, hogyan lehet a névtér osztályaival és egy XML séma felhasználásával adatbázisunk egy táblájának rekordjait módosítani.
Példaalkalmazás
A példában a program indulása után a Form-on elhelyezett szerkesztőmezőben meg kell adni, hogy mely SQL Server 2000 példányhoz kívánunk csatlakozni. A szerver nevének megadása után a Tábla feltöltése gombbal léphetünk kapcsolatba a kiszolgáló szerver-példánnyal. A szerverhez kapcsolódva elérjük a telepített XmlDb adatbázis Products tábláját. Az adatok lekérdezéséhez, és módosításához az alkalmazás mappájának /resources alkönyvtárában megtalálható ’MySchema.xml’ állományt használjuk.
Az állományban megadtuk a Products tábla szerkezetét, így a felhasznált objektum ebből olvassa ki a tábla rekordjainak értékét. Felépítése a következő:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="Pr" sql:relation="Products" >
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Name"
sql:field="Name"
type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="ID" type="xsd:integer" />
</xsd:complexType>
</xsd:element>
</xsd:schema>
A névtér elemeinek eléréséhez megadtuk a hivatkozást a névtérre, majd deklaráltunk néhány objektumot, melyekkel kapcsolódunk az adatbázishoz, és elvégezzük a módosító műveletet:
private SqlXmlCommand cmd;
private SqlXmlAdapter ad;
A Fill metódusba ágyaztuk a tábla feltöltésének kódját. Először megadtuk a kapcsolódáshoz szükséges adatokat:
cmd = new SqlXmlCommand("Provider=SQLOLEDB;Server=" + srvText.Text + ";database=XmlDb;Integrated Security=SSPI;");
Majd a SqlXmlCommand objektum property-jeit. Az XML állomány gyökérelemének nevét:
Megadjuk az XML állományban deklarált utasítás nevét:
A végrehajtandó művelet típusát, mely sémák olvasása esetén XPath típusú:
cmd.CommandType = SqlXmlCommandType.XPath;
Megadjuk az XML állomány elérési útvonalát:
cmd.SchemaPath = Application.StartupPath + "\\resources\\MySchema.xml";
Létrehozunk egy DataSet objektumot az adatok tárolására:
Példányosítjuk az adaptert a feltöltéshez, majd a már ismert módon feltöltjük a DataSet objektumot:
ad = new SqlXmlAdapter(cmd);
ad.Fill(ds);
Az adatok módosításához a megadott nevet eltároljuk a DataSet megfelelő rekordjában felülírva a létező adatot:
DataRow row = ds.Tables[0].Rows[idCombo.SelectedIndex];
row["Name"] = nameText.Text;
Majd frissítjük az adatokat az adatbázisban: