Borna66
08-03-2010, 09:05 PM
در ADO.NET دو روش برای کار با داده ها وجود دارد: DataSet و DataReader. هر کدام از اين دو روش موارد استفاده خود را دارند. اگر هدف نشان دادن سريع داده هاست DataReader مناسب تر از DataSet می باشد ولی اگر قصد انجام عملياتی بر روی داده ها داريد و لازم است داده ها در حافظه مقيم شوند بايد از DataSet استفاده کنيد. در اين مقاله چهار روش برای نمايش محتوای يک DataSet در فرمهای وب بيان می شود.
وقتی از DataSet استفاده می کنيد بدليل انبار شدن داده ها در حافظه، استفاده نادرست از آن می تواند سرعت و کارايی برنامه وب شما را کاهش دهد، البته استفاده نادرست از DataSet در برنامه های ويندوز هم تاثير منفی در کارايی برنامه دارد ولی مسلما به اندازه برنامه های وب محسوس نيست و اين بدليل آن است که در برنامه های وب امکان انجام درخواستهای همزمان از يک صفحه وجود دارد.
در اين مقاله چهار روش برای نمايش محتوای يک DataSet در فرمهای وب بيان می شود:
۱- استفاده از کنترل DataGrid
۲- استفاده از کنترل DataList
۳- استفاده از کنترل Repeater
۴- استفاده از يک متغير
هر DataSet می تواند يک يا چندين DataTable را شامل شود. برای وارد کردن داده ها به داخل DataSet نياز به استفاده از يک DataAdapter داريم. انجام مراحل زير برای وارد کردن داده ها در DataSet اساسی هستند:
• ايجاد يک Connection به پايگاه داده:
Dim strConn as string = “initial catalog=Northwind;integrated security=SSPI;persist security info=False;workstation id=DOTNET"
Dim MyConn as New SQLConnection(strConn)
• ايجاد DataSet :
Dim ds as DataSet=New DataSet()
• ايجاد DataAdapter :
Dim MySQL as string = "Select Employees.FirstName, Employees.LastName, Employees.Title from Employees"
Dim da as New SQLDataAdapter(MySQL,MyConn)
• بعد از انجام اين مراحل متد Fill از شئ DataAdapter را فراخوانی می کنيم :
da.Fill(ds,"Employees")
در تکنيک فوق بجای استفاده از عبارت ds.Tables("adbtable") ميتوانيم Ds.Tables("Users") را بکار ببريم. در بخشهای آينده ديگر فوايد استفاده از Mappings آمده است. همچنين کلاس CommandBuilder برای بهنگام کردن يک بانک که بوسيله Dataset صورت گرفته يک شيوه صحيح بشمار ميرود:
Dim cmdBLD As New OleDBCommandBuilder(objAdapter)
پارامتر اول در اين متد نام DataSet و پارامتر دوم نام DataTable جديدی است که می خواهيم تعريف کنيم.
اکنون DataSet شامل داده هايی می باشد که از DataAdapter به داخل آن انتقال يافته اند. برای نشان دادن داده های داخل DataSet از يکی از روشهای زير استفاده می کنيم:
۱- کنترل DataGrid
با استفاده از کد زير می توان جدول Employees را (که در داخل DataSet قرار دارد) در DataGrid نشان داد :
MyDataGrid.Datasource=ds.Tables("Employees").DefaultView
MyDataGrid.DataBind()
همانطور که مشاهده می کنيد ابتدا با مشخص نمودن خصوصيت Datasource کنترل DataGrid - که جدول Employees واقع در DataSet می باشد - داده ها به داخل DataGrid انتقال می يابند و سپس با فراخوانی متد DataBind داده ها بر روی صفحه نشان داده می شوند.
۲- کنترل DataList
برای مقيد کردن داده ها بر روی کنترلهای DataList و Repeater نيز همانند کنترل DataGrid می توانيد کدهای زير را بکار ببريد:
MyDataList.Datasource=ds.Tables("Employees").DefaultView
MyDataList.DataBind()
۳- کنترل Repeater
MyRepeater.datasource = ds.Tables("Employees").DefaultView
MyRepeater.DataBind()
کنترلهای DataGrid ،DataList و Repeater کنترلهای DataBound نام دارند. کنترلهای DataBound امکان تنظيم منابع داده را به صورت Programmatically فراهم می کنند. اين کنترلها بعد از تنظيم منبع داده ای بر روی آن تکرار شده و بر اساس فرمت تعيين شده برای کنترل، داده ها را نمايش می دهند. فرمت فقط برای يک سطر مشخص می شود و همه سطرها بر اساس آن نشان داده می شوند.
این که کدام کنترل را برای نمايش داده ها انتخاب کنيد به اين بستگی دارد که می خواهيد چه مقدار کنترل بر روی فرمت نمايش داده ها داشته باشيد. کنترل DataGrid آسانترين و ساده ترين راه برای به نمايش درآوردن داده ها در قالب يک جدول است. Visual Studio .NET هم قالب های آماده ای را از طريق گزينه Auto Format برای تغيير ظاهری کنترل DataGrid (و همچنين DataList) در اختيار ما قرار می دهد. DataList کمی پيچيده تر از DataGrid است ولی امکان کنترل زيادی را در رابطه با فرمت بندی از طريق استفاده از الگوها فراهم می کند. کنترل Repeater نسبت به DataList هم پيچيده تر است و می توان کنترل خيلی بيشتری را هنگام استفاده از الگوها بر روی فرمت نمايش داده ها اعمال نمود.
به دليل اين که کنترلهای DataList و Repeater به طور پيش فرض فرمت داخلی ندارند هنگام تعريف بايد آنها را فرمت بندی نماييم (فرمت کنترل DataGrid را هم می توان تغيير داد ولی اگر تغيير ندهيم مشکلی پيش نمی آيد و داده ها نمايش داده می شوند). به عنوان نمونه برای کنترل DataList می توان چنين نوشت:
<asp:DataList id="MyDataList" runat="server" GridLines="None" cellpadding="2" cellspacing="2" Headerstyle-BackColor="#8080C0" Headerstyle-Font-Name="Arial" Headerstyle-Font-Size="8" Font-Name="Arial" Font-Bold="false" Font-Size="8">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "firstname") %> <%# DataBinder.Eval(Container.DataItem, "lastname") %> - <b><i><%#DataBinder.Eval(Container.DataItem, "Title") %> </i></b>
</ItemTemplate>
</asp:DataList>
DataBinder.Eval متدی است که برای ارزيابی عبارات data-binding در زمان اجرا از آن استفاده می شود. ساختار اصلی اين متد به صورت زير است:
<%# DataBinder.Eval(Container, EvalExpression, FormatExpression) %>
Container عبارتی را بيان می کند که می خواهيم ارزيابی کنيم، برای کنترلهای DataBound هميشه مقدار Container.DataItem را به جای Container قرار می دهيم. EvalExpression نام خصوصيت يا آيتمی است که بايد ارزيابی شود و FormatExpression يک عبارت با فرمت رشته ای است که برای فرمت کردن نتيجه که يک رشته است استفاده می شود.
۴- استفاده از متغير برای نشان دادن محتوای DataSet
برای نشان دادن محتوای DataSet می توان تکنيک استفاده از متغير را بکار برد. برای اين کار ابتدا محتوای DataSet را در يک متغير از نوع String قرار می دهيم. کد لازم برای انجام اين کار به صورت زير است:
Dim sEmps as String
Dim dr As DataRow
For Each dr In ds.Tables("Employees").Rows
sEmps += "<b>" & dr("firstname") & " " & dr("lastname") & " </b> - " & dr("Title") & "<br>"
Next
روشی که در اينجا استفاده شده است پيمايش تمام سطرهای جدول مورد نظر با استفاده از يک حلقه For Each … Next است که همه آنها را در داخل متغير از نوع String قرار می دهد. سپس خصوصيت text يک کنترل literal را برابر اين متغير قرار می دهيم:
litEmps.text=sEmps
پی نوشت :
اين مقاله بر پایه ی Asp.Net 1.x آماده شده است و به بررسی استفاده از شئ DataSet و واکشی اطلاعات از يک پايگاه داده و نمایش در فرم می پردازد. هر چند که در حال حاضر با وجود کنترل های DataSource این کار آسان تر صورت می گیرد ولی این مقاله بدلیل بررسی پایه ای مطلب همچنان برای برخی برنامه نویسان مبتدی ارزشمند و مفید خواهد بود.
دانلود فایل ضمیمه | دریافت کد (http://www.aspcode.ir/Download/displaydatasetcontent.zip)
وقتی از DataSet استفاده می کنيد بدليل انبار شدن داده ها در حافظه، استفاده نادرست از آن می تواند سرعت و کارايی برنامه وب شما را کاهش دهد، البته استفاده نادرست از DataSet در برنامه های ويندوز هم تاثير منفی در کارايی برنامه دارد ولی مسلما به اندازه برنامه های وب محسوس نيست و اين بدليل آن است که در برنامه های وب امکان انجام درخواستهای همزمان از يک صفحه وجود دارد.
در اين مقاله چهار روش برای نمايش محتوای يک DataSet در فرمهای وب بيان می شود:
۱- استفاده از کنترل DataGrid
۲- استفاده از کنترل DataList
۳- استفاده از کنترل Repeater
۴- استفاده از يک متغير
هر DataSet می تواند يک يا چندين DataTable را شامل شود. برای وارد کردن داده ها به داخل DataSet نياز به استفاده از يک DataAdapter داريم. انجام مراحل زير برای وارد کردن داده ها در DataSet اساسی هستند:
• ايجاد يک Connection به پايگاه داده:
Dim strConn as string = “initial catalog=Northwind;integrated security=SSPI;persist security info=False;workstation id=DOTNET"
Dim MyConn as New SQLConnection(strConn)
• ايجاد DataSet :
Dim ds as DataSet=New DataSet()
• ايجاد DataAdapter :
Dim MySQL as string = "Select Employees.FirstName, Employees.LastName, Employees.Title from Employees"
Dim da as New SQLDataAdapter(MySQL,MyConn)
• بعد از انجام اين مراحل متد Fill از شئ DataAdapter را فراخوانی می کنيم :
da.Fill(ds,"Employees")
در تکنيک فوق بجای استفاده از عبارت ds.Tables("adbtable") ميتوانيم Ds.Tables("Users") را بکار ببريم. در بخشهای آينده ديگر فوايد استفاده از Mappings آمده است. همچنين کلاس CommandBuilder برای بهنگام کردن يک بانک که بوسيله Dataset صورت گرفته يک شيوه صحيح بشمار ميرود:
Dim cmdBLD As New OleDBCommandBuilder(objAdapter)
پارامتر اول در اين متد نام DataSet و پارامتر دوم نام DataTable جديدی است که می خواهيم تعريف کنيم.
اکنون DataSet شامل داده هايی می باشد که از DataAdapter به داخل آن انتقال يافته اند. برای نشان دادن داده های داخل DataSet از يکی از روشهای زير استفاده می کنيم:
۱- کنترل DataGrid
با استفاده از کد زير می توان جدول Employees را (که در داخل DataSet قرار دارد) در DataGrid نشان داد :
MyDataGrid.Datasource=ds.Tables("Employees").DefaultView
MyDataGrid.DataBind()
همانطور که مشاهده می کنيد ابتدا با مشخص نمودن خصوصيت Datasource کنترل DataGrid - که جدول Employees واقع در DataSet می باشد - داده ها به داخل DataGrid انتقال می يابند و سپس با فراخوانی متد DataBind داده ها بر روی صفحه نشان داده می شوند.
۲- کنترل DataList
برای مقيد کردن داده ها بر روی کنترلهای DataList و Repeater نيز همانند کنترل DataGrid می توانيد کدهای زير را بکار ببريد:
MyDataList.Datasource=ds.Tables("Employees").DefaultView
MyDataList.DataBind()
۳- کنترل Repeater
MyRepeater.datasource = ds.Tables("Employees").DefaultView
MyRepeater.DataBind()
کنترلهای DataGrid ،DataList و Repeater کنترلهای DataBound نام دارند. کنترلهای DataBound امکان تنظيم منابع داده را به صورت Programmatically فراهم می کنند. اين کنترلها بعد از تنظيم منبع داده ای بر روی آن تکرار شده و بر اساس فرمت تعيين شده برای کنترل، داده ها را نمايش می دهند. فرمت فقط برای يک سطر مشخص می شود و همه سطرها بر اساس آن نشان داده می شوند.
این که کدام کنترل را برای نمايش داده ها انتخاب کنيد به اين بستگی دارد که می خواهيد چه مقدار کنترل بر روی فرمت نمايش داده ها داشته باشيد. کنترل DataGrid آسانترين و ساده ترين راه برای به نمايش درآوردن داده ها در قالب يک جدول است. Visual Studio .NET هم قالب های آماده ای را از طريق گزينه Auto Format برای تغيير ظاهری کنترل DataGrid (و همچنين DataList) در اختيار ما قرار می دهد. DataList کمی پيچيده تر از DataGrid است ولی امکان کنترل زيادی را در رابطه با فرمت بندی از طريق استفاده از الگوها فراهم می کند. کنترل Repeater نسبت به DataList هم پيچيده تر است و می توان کنترل خيلی بيشتری را هنگام استفاده از الگوها بر روی فرمت نمايش داده ها اعمال نمود.
به دليل اين که کنترلهای DataList و Repeater به طور پيش فرض فرمت داخلی ندارند هنگام تعريف بايد آنها را فرمت بندی نماييم (فرمت کنترل DataGrid را هم می توان تغيير داد ولی اگر تغيير ندهيم مشکلی پيش نمی آيد و داده ها نمايش داده می شوند). به عنوان نمونه برای کنترل DataList می توان چنين نوشت:
<asp:DataList id="MyDataList" runat="server" GridLines="None" cellpadding="2" cellspacing="2" Headerstyle-BackColor="#8080C0" Headerstyle-Font-Name="Arial" Headerstyle-Font-Size="8" Font-Name="Arial" Font-Bold="false" Font-Size="8">
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "firstname") %> <%# DataBinder.Eval(Container.DataItem, "lastname") %> - <b><i><%#DataBinder.Eval(Container.DataItem, "Title") %> </i></b>
</ItemTemplate>
</asp:DataList>
DataBinder.Eval متدی است که برای ارزيابی عبارات data-binding در زمان اجرا از آن استفاده می شود. ساختار اصلی اين متد به صورت زير است:
<%# DataBinder.Eval(Container, EvalExpression, FormatExpression) %>
Container عبارتی را بيان می کند که می خواهيم ارزيابی کنيم، برای کنترلهای DataBound هميشه مقدار Container.DataItem را به جای Container قرار می دهيم. EvalExpression نام خصوصيت يا آيتمی است که بايد ارزيابی شود و FormatExpression يک عبارت با فرمت رشته ای است که برای فرمت کردن نتيجه که يک رشته است استفاده می شود.
۴- استفاده از متغير برای نشان دادن محتوای DataSet
برای نشان دادن محتوای DataSet می توان تکنيک استفاده از متغير را بکار برد. برای اين کار ابتدا محتوای DataSet را در يک متغير از نوع String قرار می دهيم. کد لازم برای انجام اين کار به صورت زير است:
Dim sEmps as String
Dim dr As DataRow
For Each dr In ds.Tables("Employees").Rows
sEmps += "<b>" & dr("firstname") & " " & dr("lastname") & " </b> - " & dr("Title") & "<br>"
Next
روشی که در اينجا استفاده شده است پيمايش تمام سطرهای جدول مورد نظر با استفاده از يک حلقه For Each … Next است که همه آنها را در داخل متغير از نوع String قرار می دهد. سپس خصوصيت text يک کنترل literal را برابر اين متغير قرار می دهيم:
litEmps.text=sEmps
پی نوشت :
اين مقاله بر پایه ی Asp.Net 1.x آماده شده است و به بررسی استفاده از شئ DataSet و واکشی اطلاعات از يک پايگاه داده و نمایش در فرم می پردازد. هر چند که در حال حاضر با وجود کنترل های DataSource این کار آسان تر صورت می گیرد ولی این مقاله بدلیل بررسی پایه ای مطلب همچنان برای برخی برنامه نویسان مبتدی ارزشمند و مفید خواهد بود.
دانلود فایل ضمیمه | دریافت کد (http://www.aspcode.ir/Download/displaydatasetcontent.zip)