
Mellékelt példa megnyitása előtt szükséges egy XMLSpeedTest nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A program használata előtt fel kell telepíteni a SQLXML 3.0 Service Pack 1 programcsomagot. Ehhez olvassa el a cikk Kezdeti beállítások című bekezdését.
Kezdeti beállítások
A Microsoft elkészítette, és elérhetővé tette új, az MS SQL Server 2000 XML-t támogató funkcionalitásához igazodó névterét, melyet a NET Framework 1.1-es verziója már tartalmaz.
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://www.microsoft.com/downloads/details.aspx?FamilyId=4023DEEA-F179-45DE-B41D-84E4FF655A3B&displaylang=en.
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.
A program fordítása előtt referenciaként meg kell adni a felhasznált névteret. Ehhez válasszuk tehát a Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a Microsoft.Data.SqlXml elemet.
A névtér szolgáltatásainak eléréséhez a forrásállomány fejlécében meg kell adnunk egy hivatkozást a névtérre:
using Microsoft.Data.SqlXml;
Vizsgálat elvégzése
A vizsgálat lényege, hogy lemérjük az időeltérést két lekérdezés között. Az első műveletben a Northwind adatbázis Products táblájának adatait lekérdezzük 1000 alkalommal, és a DataSet objektum segítségével egy dataset.xml nevű állományba írjuk.
A második műveletben a fenti lekérdezést 1000 alkalommal a Microsoft.Data.SqlXml névtér SqlXmlCommand osztályának segítségével végezzük el, az eredményhalmazt egy sqlxml.xml nevű állományban helyezzük el.
Az alkalmazás WebFrom1.aspx lapján elhelyeztünk két nyomógombot, melyek közül az első lenyomásával a DataSet objektummal való adatlekérdezést és adatkonverziót végezhetjük el, míg a második nyomógombbal a SQLXML csomaghoz kapcsolódó műveletet.
A műveletek időtartalmát lemérjük, és az eredményt egy feliratban megjelenítjük.
A DataSet objektummal egyszerűen elvégezhető a művelet. Szükség van egy SqlDataAdapter objektumra, mely elvégzi a SELECT * FROM PRODUCTS SQL-utasítást, majd Fill metódusával elhelyezi annak eredményét a DataSet-ben.
DateTime startTime = DateTime.Now;
for(int i=0;i<1000;i++)
{
ad = new SqlDataAdapter("SELECT * FROM Products",sqlConnection1);
ad.Fill(ds);
A DataSet tartalmát egy Stream objektum felhasználásával írjuk az állományba.
Stream xmlStream = File.OpenWrite(Server.MapPath("dataset.xml"));
ds.WriteXml(xmlStream);
xmlStream.Close();
}
DateTime endTime = DateTime.Now;
A startTime és az endTime objektumok időpontja között eltelt másodperceket jelenítjük meg a címkén.
TimeSpan fullSecond = endTime.Subtract(startTime);
Label4.Text = "Művelet időtartama: " + fullSecond.Seconds.ToString() + " másodperc";
A másik műveletben deklarálunk egy SqlXmlCommand objektumot, a konstruktorban megadva a kapcsolódás karakterláncát.
SqlXmlCommand command = new SqlXmlCommand("Provider=SQLOLEDB; Server=(local); database=Northwind;Integrated Security=SSPI;");
Megadjuk a szükséges paramétereket, valamint a lekérdezés utasítását.
command.RootTag = "Products";
command.CommandType = SqlXmlCommandType.Sql;
command.CommandText = "SELECT * FROM products FOR XML AUTO, ELEMENTS";
Majd 1000 alkalommal elvégezzük a lekérdezést, és a fájlba írást.
for(int i=0;i<1000;i++)
{
Stream xmlStream = File.OpenWrite(Server.MapPath("sqlxml.xml"));
command.ExecuteToStream(xmlStream);
xmlStream.Close();
}
Az időtartam-lekérdezés a fenti módszerrel történik.
A vizsgálat eredményeképpen arra a következtetésre jutottunk, hogy a SQLXML csomaggal és szolgáltatásaival elvégzett művelet egyértelműen gyorsabb, az 1000 alkalommal elvégzett írásművelet esetén mintegy másfélszeres időkülönbség alakult ki a DataSet objektummal végzett művelet hátrányára. A műveleteket a lokális Web kiszolgálón futtatva, 33 másodpercig tartott a DataSet-el, míg 22 másodpercig a SqlXmlCommand osztállyal végzett procedúra.
Belátható, hogy egy másodpercenként több ezres kérésszámot regisztráló Web-alkalmazás számára létszükség, hogy a kiszolgáláshoz szükséges műveleteket a lehető legrövidebb idő alatt végezze el. A részműveletek időtartamának csökkenésével pedig jelentős időnyereség érhető el a szolgáltatás egészének tekintetében.