عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
دستيابی داده XML در برنامه های دات نت ( بخش اول ) |
مديريت وب |
9467 |
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 ، خواهيم پرداخت .