Makale Özeti

SQL Server 2000, önceki versiyon ‘larından farklı olarak, barındırdığı yeni XML özellik set ‘leri ile, veri tabanlarından XML formatında veri almayı olanaklı hale getirmektedir. Bu makalede SQL Server 2000 ‘ne ait XML desteği ve bu özelliğin .NET uygulamaları içerisinden nasıl kullanıldığı ele alınmıştır.

Makale

SQL Server 2000, önceki versiyon ‘larından farklı olarak, barındırdığı yeni XML özellik set ‘leri ile, veri tabanlarından XML formatında veri almayı olanaklı hale getirmektedir. Bu makalede SQL Server 2000 ‘ne ait XML desteği ve bu özelliğin .NET uygulamaları içerisinden nasıl kullanıldığı ele alınmıştır.

FOR XML Deyimi

FOR XML deyiminin çalıştırılması sonucunda elde edilecek XML dökümanının yapısı, bu deyime eklenen (AUTO, RAW) gibi anahtar sözcüklerle belirlenir. Bu anahtar sözcükleri tek tek işleyecek olmakla birlikte, verilen örnekleri deneyebilmek ve çıkan sonuçları gözlemleyebilmek için, “SQL Server Query Analyzer” isimli aracı kullanabilirsiniz.

AUTO : Bu anahtar sözcük, sorgulama sonucunda dönen kayıtların; nitelik(attribute)-değer(value) çiftleri şeklinde ifade edilmesini sağlar. Sorgulama deyiminde belirtilen alan isimleri nitelikler ile ifade edilirken, söz konusu alanların içerdiği veriler, bu niteliğe atanan değerler şeklinde ifade edilir. Aşağıda “FOR XML AUTO” eklentisi içeren SQL deyimi kullanılarak, Northwind veritabanındaki Employees tablosundan, EmployeeID alanındaki değeri dört ‘ten küçük olan kayıtlar sorgulanmıştır.

Select EmployeeID, LastName, FirstName
From Employees
Where EmployeeID < 4
For XML AUTO

Bu sorgulama sonucunda elde edilen kayıt seti, aşağıdaki gibi bir XML dökümanı şeklinde alınmıştır;

<?xml version="1.0" encoding="utf-8" ?>

<Employees>

   <Employees EmployeeID="1" LastName="Davolio" FirstName="Nancy" />

   <Employees EmployeeID="2" LastName="Fuller" FirstName="Andrew" />

   <Employees EmployeeID="3" LastName="Leverling" FirstName="Janet" />

</Employees>

RAW : Bu anahtar sözcük, sorgulama sonucunda dönen kayıtların AUTO anahtar sözcüğünde olduğu gibi; nitelik-değer çiftleri şeklinde ifade edilmesini sağlar. Sorgulama deyiminde belirtilen alan isimleri nitelikler ile ifade edilirken, söz konusu alanların içerdiği veriler, bu niteliğe atanan değerler şeklinde ifade edilir. Ancak RAW anahtar sözcüğü kullanıldığı zaman, AUTO ‘dan farklı olarak, kayıtları temsil eden element ‘ler, “row” sözcüğü ile adlandırılır. Aşağıda “FOR XML RAW” eklentisi içeren SQL deyimi kullanılarak, Northwind veritabanındaki Employees tablosundan, EmployeeID alanındaki değeri dört ‘ten küçük olan kayıtlar sorgulanmıştır.

Select EmployeeID, LastName, FirstName
From Employees
Where EmployeeID < 4
For XML Raw

Bu sorgulama sonucunda elde edilen kayıt seti, aşağıdaki gibi bir XML dökümanı şeklinde alınmıştır;

<?xml version="1.0" encoding="utf-8" ?>

<Employees>

   <row EmployeeID="1" LastName="Davolio" FirstName="Nancy" />

   <row EmployeeID="2" LastName="Fuller" FirstName="Andrew" />

   <row EmployeeID="3" LastName="Leverling" FirstName="Janet" />

</Employees>

ELEMENTS : Bu anahtar sözcük, sorgulama sonucunda dönen kayıtlara ait alanların ve bu alanların içerdiği verilerin, ayrı ayrı element ‘ler olarak ifade edilmesini sağlar. Aşağıda “FOR XML AUTO, ELEMENTS” eklentisi içeren SQL deyimi kullanılarak, Northwind veritabanındaki Employees tablosundan, EmployeeID alanındaki değeri dört ‘ten küçük olan kayıtlar sorgulanmıştır.

Select EmployeeID, LastName, FirstName
From Employees
Where EmployeeID < 4
For XML AUTO, Elements 

Bu sorgulama sonucunda elde edilen kayıt seti, aşağıdaki gibi bir XML dökümanı şeklinde alınmıştır;

<?xml version="1.0" encoding="utf-8" ?>

<Employees>

       <Employees>

            <EmployeeID>1</EmployeeID>

            <LastName>Davolio</LastName>

            <FirstName>Nancy</FirstName>

       </Employees>

       <Employees>

            <EmployeeID>2</EmployeeID>

            <LastName>Fuller</LastName>

            <FirstName>Andrew</FirstName>

       </Employees>

       <Employees>

            <EmployeeID>3</EmployeeID>

            <LastName>Leverling</LastName>

            <FirstName>Janet</FirstName>

       </Employees>

</Employees>

XMLDATA : Bu anahtar sözcük, sorgulama sonucunda dönen dökümanın şema bilgisi içermesini de sağlar. Aşağıda XMLDATA anahtar sözcüğü içeren SQL deyimi kullanılarak, Northwind veritabanındaki Employees tablosundan, EmployeeID alanındaki değeri dört ‘ten küçük olan kayıtlar sorgulanmıştır.

Select EmployeeID, LastName, FirstName
From Employees
Where EmployeeID < 4
For XML Auto, XMLDATA

Bu sorgulama sonucunda elde edilen kayıt seti, aşağıdaki gibi bir XML dökümanı şeklinde alınmıştır;

<?xml version="1.0" encoding="utf-8" ?>

<Employees>

<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data"  xmlns:dt="urn:schemas-microsoft-com:datatypes">

     <ElementType name="Employees" content="empty" model="closed">

         <AttributeType name="EmployeeID" dt:type="i4" />

         <AttributeType name="LastName" dt:type="string" />

         <AttributeType name="FirstName" dt:type="string" />

         <attribute type="EmployeeID" />

         <attribute type="LastName" />

         <attribute type="FirstName" />

     </ElementType>

</Schema>

   <Employees xmlns="x-schema:#Schema1" EmployeeID="1" LastName="Davolio" FirstName="Nancy" />

   <Employees xmlns="x-schema:#Schema1" EmployeeID="2" LastName="Fuller" FirstName="Andrew" />

   <Employees xmlns="x-schema:#Schema1" EmployeeID="3" LastName="Leverling" FirstName="Janet" />

</Employees>

SQL Server 2000 İle .NET Uygulamalarının Entegrasyonu

Veri yönelimli bir .NET uygulaması ile, SQL Server 2000 ‘ne ait XML özelliklerinin entegre edilmesi için; SqlCommand sınıfının ExecuteXmlReader() isimli metodu kullanılabilir. Bu metot, FOR XML eklentisi içeren SQL deyimlerini çalıştırarak, elde ettiği sonuç setini, XmlReader sınıfı türündeki bir nesne referansı şeklinde döndürür. Prototipi;

Public Function ExecuteXmlReader() As XmlReader

Örnek : Aşağıdaki uygulamada, pubs veritabanına ait, publishers tablosundan, “XML formatında” alınan yayıncı isimleri, bir messagebox ile kullanıcıya gösterilmiştir.

Dim oCnn As New SqlConnection()
oCnn.ConnectionString = "Data Source=localhost;"
oCnn.ConnectionString &= "Database=pubs;integrated security=sspi"
oCnn.Open()

Dim sSQL As String
sSQL = "Select pub_name From publishers FOR XML AUTO, ELEMENTS"
Dim oCmd As SqlCommand
oCmd = New SqlCommand(sSQL, oCnn)

Dim oRdr As XmlReader
oRdr = oCmd.ExecuteXmlReader()

Dim s As String

Do While (oRdr.Read())
       s &= oRdr.Value
Loop
MsgBox(s)
oCnn.Close()


Aykut TAŞDELEN

aykuttasdelen@yazgelistir.com