بازيابی داده XML از سرويس دهنده SQL New Page 1



ساير




 

 

 

SAKHA RAVESH CO.

 ا مروز

 سه شنبه  5  ارديبهشت  1396  2017  Apr.  25   Tuesday ToDay
صفحه اصلی  مقالات نکته هادايره المعارف خودآموزها | تازه ها خود آزمون ها    
  نسخه قابل چاپ  

    5 4 3 2 1 

 عنوان

 نويسنده

  مشاهده

 تعداد آراء

 امتياز

 دستيابی داده XML در برنامه های دات نت ( بخش اول )

 مديريت وب

9307

12

3

با توجه به جایگاه داده در عصر حاضر و  لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر  روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و  خدمات خود  را از طریق  سایت www.fabak.ir  به مخاطبان محترم عرضه می نماید

 

دستيابی به داده XML در برنامه های دات نت

دستيابی به داده XML در برنامه های دات نت ( بخش اول )

طراحی و پياده سازی نرم افزار بر روی پلات فرم ويندوز از زمان معرفی ويندوز تاکنون ، دستخوش تحولات  فراوانی شده است . نسخه های اوليه ويندوز، شامل يک اينترفيس برنامه نويسی ( API) بودند که از تعدادی فايل DLL)Dynamic link library) شانزده بيتی تشکيل شده بود. برنامه نويسان ، قادر به فراخوانی و بخدمت گرفتن  هر يک از توابع موجود در برنامه های خود بودند.در ويندوز 95 و NT ، اينترفيس فوق ، ارتقاء و به فايل های DLL سی و دو بيتی تبديل گرديد. از توابع موجود بعنوان Win32 API  نام برده می شود. Win32 API ، بدون ترديد روشی قدرتمند بمنظور ارتباط برنامه های نوشته با سيستم عامل را در اختيار پياده کنندگان نرم افزاری قرار می دهد که ويندوز را بعنوان بستر پياده سازی انتخاب نموده اند. عليرغم تمامی مزايای اينترفيس فوق ، برنامه نويسی با آن پيچيده وامکان  گسترش آنها نيز وجود نداشت . تحول بعدی در پياد ه سازی نرم افزار در ويندوز ، به COM)Componet Object Model) بر می گردد. پياده سازی مبتنی بر COM ، رويکردی شی گراء  بمنظور ايجاد برنامه هائی با قابليت استفاده مجدد از عناصر بوده و روشی استاندارد بمنظور يافتن و استفاده از عناصر موجود COM ( نظير کنابخانه ADO ) را در اختيار برنامه نويسان  قرار می دهد . عناصر COM ، می بايست  در ريجستری ويندوز ثبت و از کنابخانه های نوع  ارائه شده ، بمنظور تشريح عمليات مورد نظر استفاده می نمايند. بنابراين، امکان فراخوانی و استفاده از  عناصر فوق،  توسط برنامه های سرويس گيرنده بسادگی ميسر خواهد شد. رويکرد فوق ، عليرغم داشتن مزايای بمراتب بيشتری نسبت به Win32 API ، دارای محدوديت های مختص بخود است . وجود تفاوت بين زبانهای برنامه نويسی( نظير متفاوت بودن نوع داده ها )، می تواند عدم سازگاری بين عناصر COM را بدنبال داشته باشد . علاوه بر اين ، ضرورت ثبت اينگونه عناصر در ريجستری می تواند باعث بروز مسائل مربوط به نسخه های متفاوت در زمان بهنگام سازی يک عنصر خاص گردد و مشکلاتی را برای سرويس گيرندگان بوجود آورد. بمنظور حل مشکلات فوق و ارائه يک محيط پياده سازی که مناسب عصراينترنت باشد ، ماکروسافت يک پلات فرم جديد با نام " دات نت " را ايجاد نموده است .
در مجموعه مقالاتی که در اين خصوص ارائه خواهد شد به بررسی پلات فرم فوق پرداخته و با امکانات کلاس های
ADO.NET  ، بمنظور بازيابی داده XML از SQL Server
  ، آشنا خواهيم شد.

معرفی فريمورک دات نت
تاکنون صدها کتاب  و مقاله در رابطه با فريمورک دات نت و ويژوال استوديو (شامل ابزارهای مورد نياز برای ايجاد برنامه های دات نت ) نوشته شده است . بدين دليل در اين بخش ما تصميم نداريم بر روی مفاهيم و معماری پلات فرم متمرکز شده و صرفا" به معرفی اوليه  دات نت ، خواهيم پرداخت .
 فريمورک دات نت ، خدمات بسيار زيادی را در اختيار پياده کنندگان نرم افزار قرار می دهد .از مهمترين سرويس ها ی ارائه شده در اين خصوص می توان به  دو سرويس مهم آن اشاره کرد : ارائه يک محيط مديريت يافته ( اداره شده ) برای اجرای کدها  و ارائه  مجموعه ای گسترده از کلاس هائی که می توان از آنان بمنظور انجام عمليات متداول  استفاده کرد . در ادامه به تشريح هر يک از موارد فوق ، خواهيم پرداخت .
کد هائی که مقصد آنان فريمورک دات نت است را کد مديريت يافته ( اداره شده ) ، می گويند. برای نوشتن اين نوع کد ها ، می توان از هر زبان برنامه نويسی که قادر به ترجمه کدها به
MSIL)Microsot intermediate langauge) باشد، استفاده کرد( در مقابل کد ماشين ). کد MSIL ، در ادامه توسط مترجم JIT)just in time) ، که توسط CLR)Common language runtime) فريمورک دات نت ارائه شده است،  به کد ذاتی ( native) ماشين مربوطه ترجمه می گردد. بدين ترتيب ، پس از نوشتن برنامه و ترجمه آن امکان تبديل آن بصورت اسمبلی ( assembly) ، فراهم خواهد شد. ( اسمبلی ، شامل يک و يا چندين فايل DLL و يا EXE  است ) . در ادامه می توان اسمبلی را بر روی هر نوع پلات فرمی  که دارای يک نسخه پياده سازی شده از فريمورک دات نت  است ، توزيع نمود. در اين رابطه ، ضرورتی به اعمال  تغييرات  وجود نخواهد داشت . بخاطر داشته باشيم که اگر برنامه نوشته شده ( کد مديريت يافته ) از کتابخانه کلاس مختص يک پلات فرم و يا اينترفيس برنامه نويسی وابسته به يک پلات فرم خاص استفاده نمايد ، کد صرفا" بر روی سيستم عامل بخصوصی ، اجراء خواهد شد. پس از نصب کد ( تکثير فايل های اسمبلی )، امکان اجرای آنان در يک محيط ايمن و قدرتمند مديريت يافته توسط CLR  فريمورک دات نت، فراهم می گردد. محيط فوق ، امکانات متعددی نظير : امنيت برنامه ، اختصاص حافظه ، يافتن و استقرار پويای کد در حافظه را ارائه می نمايد. محيط اجراء فوق ، اين امکان را در اختيار پياده کنندگان نرم افزار قرارخواهد داد که در زما ن طراحی و پياده سازی نرم افزار بر روی سياست های راهبردی و عملياتی نرم افزار متمرکز شده و خود را درگير مسائل و نگرانی های موجود در ارتباط با امکانات زير بنائی و اساسی مورد نياز، ننمايند. کد نوشته شده ،  توسط CLR مديريت(اداره) خواهد شد.
CLR فريمورک دات نت، مجموعه ای گسترده از کلاس ها را ارائه که می توان از آنان در برنامه های متفاوت استفاده کرد. کلاس های ارائه شده ، پتانسيل لازم در خصوص دستيابی به سيستم فايل ، دستيابی به داده ، پردازش XML ، عمليات بر روی رشته ها ، رمزنگاری داده و ساير عمليات متدوال در يک نرم افزار را در اختيار پياده کنندگان قرار می دهد. فريمورک دات نت ، همچنين مجموعه ای از نوع های متداول داده ( Common data types :CTS ) ، را ارائه که با استفاده از آنان ، شاهد سازگاری  بين تمامی کدهای مديريت يافته، صرفنظر از زبانی که کدها توسط آن نوشته شده اند ، خواهيم بود . با توجه به ماهيت شی گراء فريمورک دات نت ، می توان اقدام به ايجاد کلاس هائی کرد که از کلاس های موجود به ارث رسيده باشند( پاسخی شايسته به نياز پياده کنندگان نرم افزار).
کلاس ها در فريمورک دات نت بصورت سلسله مراتبی و در
Namespace ها ، سازماندهی می گردند . کلاس های اساسی دات نت در System ، تعريف شده اند. در namespace فوق ، نوع های داده اساسی اوليه نظير String ، Double ،  وساير namespace های ديگر نظير IO و Data  قرار دارند. اسامی هر کلاس به دو صورت ارائه می گردد : يک نام کوتاه نظير string و يا  File و يک نام کامل سلسله مراتبی نظير System.string و يا System.IO . اولين بخش در نام سلسله مراتبی فوق ، نام namespace مربوطه و آخرين بخش مربوط به نام "نوع " ، است . مثلا" System.IO.File ، نشاندهنده نوع File بوده که متعلق  به namespace با نام System.IO است .
 در ماژول های کد ، نام
namespace می بايست import ، گردد . در اين حالت می توان از نام کوتاه آن استفاده کرد. گرامر استفاده از يک namespace در زبان های متفاوت ، متغير است . مثلا" در #C از کليد واژه Using و در VB.NET از Imports ، استفاده می گردد .

ايجادر برنامه های دات نت
با استفاده از فريمورک دات نت می توان انواع متفاوتی از برنامه ها را ايجاد نمود( عناصر
Business ، برنامه های سنتی مبتنی بر فرم در ويندوز، برنامه های وب  ، سرويس های وب XML ) . تکنولوژی ASP.NET ، واژه ای است که به مجموعه ای از کلاس های موجود در فريمورک دات نت اطلاق و امکان ايجاد وب سايت های کاملا" پويا را با  بهره مندی از پتانسيل های CLR فريمورک دات نت، در اختيار پياده کنندگان قرار خواهد داد. سرويس های وب XML ، برنامه هائی هستند که امکان عرضه و استفاده  از خدمات آنان از طريق SOAP فراهم می گردد ( اين نوع برنامه ها توسط سرويس گيرندگان موجود بر هر نوع پلات فرمی در اينترنت ، قابل استفاده خواهند بود) .
برای ايجاد برنامه های دات نت ، می توان از يک اديتور متنی ساده نظير
Notepad استفاده کرد ولی در اکثر پروژه های جدی و بزرگ می بايست از ابزار پياده سازی نرم افزار که بمنظور کار با فريمورک دات نت طراحی شده است ، استفاده گردد . بدين دليل، ماکروسافت نسخه قبلی ابزار پياده سازی نرم افزار خود را ( ويژوال استوديو ) ارتقاء تا امکان ايجاد برنامه های دات نت بکمک آن بسادگی محقق گردد. با استفاده از ويژوال استوديو دات نت، امکان ايجاد برنامه با استفاده از# VB.NET ,Visual C++ , C
، فراهم می گرد  ويژوال استوديو دا ت نت، شامل تمپليت هائی بمنظور ارائه اينترفيس های گرافيکی بمنظور افزودن رابط های  اسمبلی ، اشکال زدائی و بکارگيری برنامه ها، است .

استفاده از ADO.NET برای بازيابی داده XML از سرويس دهنده SQL
فريمورک دات نت ، شامل مجموعه ای از کلاس های مورد نياز برای دستيابی داده بوده که به تمام مجموعه فوق با نام ADO.NET مراجعه می گردد . در معماری ADO.NET ، مجموعه ای از کلاس های مورد نياز بمنظور دستنيابی به يک بانک اطلاعاتی SQL ، پيش بينی شده است. کلاس های ADO.NET ، در namespace با نام System.Date قرار دارند. کلاس های مرتبط با  سرويس دهنده SQL ،  در namespace با نام System.Data.SqlClient ، قرار دارند .
 قبل از انجام هر گونه عمليات مرتبط با يک بانک اطلاعاتی سرويس دهنده
SQL در يک برنامه دات نت ، می بايست در ابتدا با بانک اطلاعاتی مورد نظر با استفاده از کلاس SqlConnection ،يک ارتباط برقرار گردد .در ادامه می توان با استفاده از کلاس SqlCommand  ، دستور موردنظر را تعريف کرد.پارامترهای مورد نياز  را می توان با استفاده از کلاس SqlParameter ، مشخص کرد.
برای بازيابی داده در
ADO.NET ، از دو رويکرد عمده استفاده می گردد .

  • رويکرد اول ، شامل استفاده از نوع خاصی از کلاس Reader ،  است ( معمولا"  يک DataReader ) . کلاس های  DataReader اينترفيس IDataReader تعريف شده در namespace بانام System.Data را نظير کلاس SqlDataReader در رابطه با سرويس دهنده SQL ، پياده سازی می نمايند.DataReader ، نمايشی از داده ها را بصورت Tabular,Read-only و Forward-Only ارائه می نمايد. با اينکه روشی مستقيمی  برای تبديل داده های موجود در DataReader به XML وجود ندارد ، در موارديکه قصد بازيابی بخش هائی از اطلاعات موجود در يک سرويس دهنده SQL بصورت XML وجود داشته باشد، می توان داده ها را با استفاده از متد ExecuteXmlReader مربوط به کلاس SqlCommand در کلاس System.Xml.XmlReader مستقر نمود. کلاس XmlReader ، داده های XML را کپسوله و امکان خواندن ترتيبی آنان را فراهم می نمايد.

  • رويکرد دوم ، شامل استفاده از کلاس System.Data.DataSet است . کلاس DataSet ،  امکان ايجاد يک Cache غير متصل از داده ها ( امکان بهنگام سازی محلی آن وجود خواهد داشت ) را قبل از ارسال تغييرات به منبع داده، فراهم می نمايد. DataSet ها ، اطلاعات خود را در اشياء DataTable ذخيره که می توان با استفاده از اشياء DataRelation  به يکديگر مرتبط تا امکان ايجاد يک نمايش رابطه ای از داده ها ( شامل هر گونه محدوديت های رابطه ای ) ، فراهم گردد. DataSet ها می توانند بعنوان XML ، سريال شده تا امکان ارسال آنها از طريق HTTP در بين فرآيندهای متفاوت فراهم  گردد .

بازيابی XML با استفاده از کلاس SqlCommand
با استفاده از متد
ExecuteXmlReader مربوط به کلاس SqlCommand می توان خروجی مورد نظر خود را از طريق يک پرس وجو FOR XML  ، به درون يک شی XmlReader  ، بازيابی کرد. XmlReader ، کلاسی بمنظور پردازش XML بصورت Forward-only و Read-only است . با توجه به اينکه XmlReader  يک کلاس abstract است ، شامل هيچگونه کدی نبوده و می بايست از کلاسی که از XmlReader به ارث رسيده باشد، بمنظور پردازش XML استفاده کرد. فريمورک دات نت، سه کلاس را بمنظور پياده سازی کلاس XmlReader ارائه می نمايد :     

  • System.Xml.XmlTextReader . کلاس فوق ، بمنظور پردازش سريع XML بعنوان يک Text stream ، طراحی شده  ولی معتبر سازی داده ها را حمايت نمی نمايد.

  • System.Xml.XmlValidatingReader. کلاس فوق ، نيز بمنظور پردازش XML بعنوان Text stream ، طراحی شده است ولی امکان معتبرسازی XML را بر اساس يک DTD و يا Schema  ، فراهم می نمايد.

  • System.Xml.XmlNodeReader . کلاس فوق ، بمنظور خواندن داده از شی XmlNode طراحی شده است . متد ExecuteXmlReader مربوط به کلاس SqlCommand  يک شی XmlTextReader را که شامل داده های XML بازيابی شده در اثر اجرای دستور موردنظر است را برمی گرداند . در صورتيکه متغيری که مقدار برگردانده شده را در خود ذخيره می نمايد بعنوان XmlReader تعريف گردد ، به نوع XmlTextReader  تبديل خواهد شد. در صورتيکه متغير فوق از نوع XmlValidatingReader و يا XmlNodeReader  تعريف گردد ، باعث بروز خطاء در زمان فراخوانی ExecuteXmlReader خواهيم شد.

بمنظور آگاهی از نحوه برگرداندن داده به يک XmlTextReader از طريق سرويس دهنده SQL ، برنامه زير را ، دنبال می نمائيم .پس از اجرای برنامه فوق، فايلی با نام XmlReader.xml شامل محصولات موجود در بانک اطلاعاتی Northwind ، ايجاد خواهد شد . پس از تايپ برنامه  ، آن را در فايلی با نام GetXmlReader.vb ، ذخيره می نمائيم.

بازيابی داده از بانک اطلاعاتی و ذخيره آنان در يک فايل XML

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Xml
Imports System.IO
 Public Class GetXmlReader
    Public Shared Sub Main()
         'Connect to the database
        Dim connstring As String = "SERVER=(local);" & _
            "DATABASE=Northwind;INTEGRATED SECURITY=sspi;"
        Dim conn As New SqlConnection(connstring)
        conn.Open()
         'Specify the command
        Dim sqlstring As String = _
            "SELECT ProductID, ProductName " & _
            "FROM Products ORDER BY ProductID " & _
            "FOR XML AUTO"
        Dim cmd As New SqlCommand(sqlstring, conn)
         'Return the results to an XmlTextReader
        Dim xDoc As XmlTextReader
        xDoc = cmd.ExecuteXmlReader()
         'Process the XML Fragment
        xDoc.MoveToContent()
        Dim fileWriter As New StreamWriter("XmlReader.xml")
        fileWriter.WriteLine("<?xml version='1.0'?>")
        fileWriter.WriteLine("<Catalog>")
        Do While xDoc.IsStartElement
            fileWriter.WriteLine(xDoc.ReadOuterXml())
        Loop
        fileWriter.WriteLine("</Catalog>")
        'Close the XmlTextReader to free the connection
        xDoc.Close()
         'Clean up
         conn.Close()
        fileWriter.Close()
     End Sub
End Class

برای ترجمه برنامه فوق با استفاده از مترجم VB.NET ، دستور زير را از طريق command prompt ، وارد می نمائيم . ( از طريق فولدری که شامل GetXmlReader.vb ) است .

vbc /r:System.dll  /r:System.Data.dll  /r:System.Xml.dll  GetXmlReader.vb

دستور فوق، يک فايل اجرائی با نام GetXmlReader.exe را ايجاد می نمايد . پس از اجرای برنامه فوق ،  يک فايل XML با نام XmlReader.xml ، در فولدری که فايل اجرائی قرار دارد ، ايجاد می گردد. محتويات فايل فوق ، مشابه زير خواهد بود :

محتويات فايل XmlReader.xml

<?xml version="1.0"?>
<Catalog>
    <Products ProductID="1" ProductName="Chai" />
    <Products ProductID="2" ProductName="Chang" />
    ...
</Catalog>

توضيحات برنامه
برای ارائه الگوی بازيابی اطلاعات از سرويس دهنده
SQL ، از متد ExecuteXmlReader مربوط به کلاس SqlCommand استفاده شده است . در ابتدا با استفاده از شی SqlConnection ، با بانک اطلاعاتی ارتباط برقرارمی گردد. در ادامه با استفاده از شی SqlCommand ، يک پرس وجو FOR XML  و يا Stored procedure مشخص شده است و بدين ترتيب يک بخش  XML  ، برگردانده می شود. در ادامه نيازمند تعريف يک شی XmlTextReader بمنظور درج نتايج خواهيم بود . بدين ترتيب ، با استفاده از متد ExecuteXmlReader امکان برگرداندن داده ، فراهم می گردد . پس از برگرداندن داده ، می توان از متدها و خصلت های کلاس XmlTextReader بمنظور حرکت بسمت جلو در طول بخش XML ،استفاده کرد. کد ارائه شده ، يک المان ريشه ( <Catalog> )  را ايجاد و با استفاده از متد MoveToContent در اولين المان مربوطه در بخش XML ، مستقر می گرديم . در ادامه با استفاده از يک حلقه تکرار در بين المان های موجود،حرکت و با استفاده از خصلت IsStartElement ، بررسی لازم در خصوص محل جاری در رابطه با استقرار در ابتدای يک المان قبل از استفاده از متد ReadOuterXml ،انجام خواهد شد . در نهايت المان ريشه بسته خواهد شد.

در بخش دوم اين مقاله به بررسی ، ساير روش های موجود بمنظور بازيابی داده XML از يک سرويس دهنده بانک اطلاعاتی SQL ، خواهيم پرداخت .



جستجو

مقالات                 
دايره المعارف       
دوره های آموزشی


 

 

مشاهده گروه ها



              

 

 تهيه شده در شرکت سخا روش -  1382