مقدمه
به
عنوان یک
برنامه نویس
وب ، بیشتر
زندگی ما در
کنار کار با
داده ها می
گذرد. معمولا
دیتابیسی
برای ذخیره
داده ها ، کد
هایی برای
بازیابی و
ویرایش داده
ها و صفحاتی
برای نشان
داده ها ایجاد
می کنیم. این
اولین مجموعه
ای از آموزش
ها است که در
طی یک سری
مقالات
یکپارچه ، به
ارائه تکنیک
هایی برای
پیاده سازی هر
چه بهتر این
الگو های
معمول، در ASP.NET 2.0
پرداخته شده
است. ما در این
سری مقاله ها
کارمان را با
پیاده سازی یک
software architecture
که شامل سه لایه
، Data
Access Layer (DAL) با
استفاده ازTyped DataSetsیک لایه Business Logic Layer که بر روی
قوانین تجاری
متمرکز شده و
یک لایه presentation که شامل
مجموعه ای از
صفحات ASP.NET است ،
تشکیل شده
است. در
این مجموعه
مقالات پس از
اینکه
پیکربندی اصلی
ساخته شد ، در
مورد موارد
جزئی تر قدم
به قدم به
تفصیل بحث
خواهد شد. کدهای
هر یک از
مقالات هم به
زبان C# و هم به
زبان VB.NET قابل download و
استفاده است .
در
این مقاله ها
از پایگاه
داده Northwind نسخه Microsoft SQL
Server 2005 Express Edition
استفاده شده
است. کدهای
مربوط به این
دیتابیس در
پوشه App_Data پروژه
همراه این مجموعه،
قرار دارد .
در
این مقاله ما
کار را از
ابتدا با
ساختن لایه Data
Access Layer (DAL) شروع
خواهیم کرد ،
در مقاله دوم
لایه Business
Logic Layer (BLL) را
خواهیم ساخت و
در سومین
مقاله بر رو ی page layout کار
خواهیم کرد.
ما در اولین
مقاله موارد و
نکته های
زیادی را
تصمیم داریم برای
شما تشریح
کنیم پس اگر
موافق هستید
شروع کنیم !
1- ايجاد
لايه دستيابي
به داده(data access layer)
در
هنگام كار با
داده ها يك
گزينه تعبيه ي
منطق مخصوص
داده به صورت
مستقيم و بي
واسطه در لايه
ي نمايش
ميباشد(در
پروژه هاي وب
صفحات ASP.NET لايه
نمايش را
تشكيل مي
دهند) كه اين
شيوه دستيابي
به داده ها را
به شدت با
لايه نمايش
پيوند مي دهد.
روش پيشنهادي
ما جداسازي
لايه نمايش از
منطق دستيابي
به داده مي
باشد. لايه ي
جداگانه
دستيابي به
داده ها Data access layer
و به اختصارDAL
ناميده مي شود.
تمام
كدهايي كه باdatasource كار
مي كنند از
قبيل ايجاد connection
و دستورات SELECT، INSERT، UPDATE، DELETE بايد در DAL جايگذاري
شوند و لايه
نمايش نبايد
هيچگونه ارجاعي
به كدهاي
دستيابي به
داده داشته
باشد بلكه مي
تواند براي هر
درخواست
دستيابي به
داده ها DAL را فراخواني
نمايد. به طور
كلي DAL
شامل متدهايي
براي دستيابي
به داده هاي
پايگاه داده
مي باشد. در
اين مقاله ما
از پايگاه
داده northwind
استفاده مي
نماييم كه
شامل جداول products و categories مي باشد.
در DAL
ما متدهايي
مشابه متدهاي
زير به منظور
كار با داده
ها ايجاد مي
نماييم
GetCategories():
اطلاعات
مربوط به تمام
اقلام را باز
مي گرداند
GetProducts():
اطلاعات
مربوط به تمام
محصولات را
بازمي گرداند
GetProductsByCategoryID(categoryID): تمام
محصولات
مرتبط با يك
دسته خاص را
باز مي گرداند
GetProductByProductID(productID): اطلاعات
مربوط به يك
محصول خاص را
با زمي گرداند
اين متدها
هنگامي كه
فراخواني مي
شوند به پايگاه
داده متصل شده
وquery مربوط به
خود را اجرا
مي نمايند و
نتيجه را باز
مي گردانند.
اين متدها مي
توانند يك dataset و يا datareader كه با بازگردانند..
اما به طور
ايده ال اين
نتايج بايد با
استفاده از اشياي
strongly_typed
بازگردانده
شوند. يك شي strongly_typed شي اي مي
باشد كه شماي
آن در زمان
كامپايل مشخص
مي شود و در
مقابل آن ، شي loosly_typed است كه
شماي آن تا
زمان اجرا نا
شناخته مي باشد.
به عنوان
مثال datareader
وdataset به صورت
پيش فرض اشياي
loosly_typed مي باشند و
شماي آنها
بوسيله
ستونهايي كه
از query پايگاه
داده
بازگردانده
مي شوند در
زمان اجرا
مشخص مي شود.
براي دستيابي
به يك ستون
خاص از يك looselytyped
DataTable از اين
كد استفاده مي
نماييم:
DataTable.Rows [index]["columnName"]
. براي
دستيابي به يك
ستون خاص از
يك stronglytyped
DataTable از اين
كد استفاده مي
نماييم:
DataTable.Rows [index].columnName
براي
بازگرداندن
اشياي strongly_typed برنامه
نويس مي تواند
از custom business object و يا typed
dataset
استفاده نمايد.
يك business object توسط
برنامه نويس
به صورت كلاسي
كه خواصش (property) بيانگر
ستونهاي جدول
پايگاه داده
مي باشد، پياده
سازي مي شود. و
يك typed dataset كلاسي
است كه توسط vs بر اساس
شماي پايگاه
داده ايجاد مي
شود و اعضاي
آن بر اساس
اين شما قويا
تعريف مي
شوند.
ما
در اين مقاله
از strongly_typed
dataset
استفاده مي
كنيم . شكل 1
گردش كار بين
لايه هاي
مختلف يك application
را كه از typed dataset
ها استفاده مي
كند، نشان مي
دهد.
شكل1:
تمامي كدهاي
دستيابي به
داده به DAL
محول مي شود
ايجاد
يك Typed
dataset و table adapter
ساختDAL
را با اضافه
كردن يك typed dataset
به پروژه آغاز
ميكنيم. بدين
منظور برروي project
در solution explorer راست كليك
كرده و add new item را
انتخاب
نماييد. گزينه
dataset را
از ليست
انتخاب
نماييد و آن
را northwind.xsd نامگذاري
كنيد.
شكل
2: اضافه كردن dataset
به پروژه
سپس
designer
مربوط
به typed dataset
نمايش داده مي
شود و wizard مربوط به
ساختار بندي table adapter
كه به شما
امكان اضافه
كردن اولين tableAdapter
به typed dataset را مي دهد
آغاز به كار
مي نمايد.
يك
typed dataset به صورت يك
مجموعه ي strongly_typed
از داده مي
باشد و تركيبي
از نمونه هاي strongly_typed datatable مي
باشد كه هر يك
از آنها نيز
تركيبي از
نمونه هاي strongly_typed datarow
مي باشند. ما
براي هر جدول
پايگاه داده
كه مي خواهيم
از آنها در
پروژه
استفاده
نماييم يك strongly_typed datatable
ايجاد مي
نماييم .
ابتدا با
ايجاد يك datatable براي
جدول product
شروع مي
نماييم.
به
خاطر داشته
باشيد كه strongly_typed datatable
هيچ اطلاعاتي
در مورد نحوه
ي دستيابي به داده
هاي جدول
مربوط به خود
ندارد. به
منظور
بازيابي داده
ها از جدول و
بارگذاري
آنها در datatable ، از كلاس dataadapter استفاده
مي نماييم.
براي products
datatable ، tableadapter شامل
متدهايGetProducts()،GetProductByCategoryID(categoryID)، مي باشد،
كه قابل
فراخواني از
لايه نمايش مي
باشند. datatable
به صورت اشياي
strongly_typed ميباشد كه
نقش پاس دهنده
داده بين لايه
ها را بر عهده
دارد.
Wizard ساختار
بندي tableadapter ، با
درخواست انتخاب پايگاه
داده مورد نظر
آغاز مي شود. Drop_down ليست
پايگاه داده
هاي server explorer
را نشان مي
دهد. اگر
پايگاه داده northwind را در server
explorer اضافه
نكرده ايد مي
توانيد دكمه ي
new
connection را به
منظور اضافه
كردن آن كليك
كنيد.
شكل
3: انتخاب
پايگاه داده northwind از drop_down
ليست
پس
از انتخاب
پايگاه داده ،
در مورد ذخيره
سازي connection string در فايل web.config پرسش مي
شود. با ذخيره
سازي connection string در اين
فايل از كد
كردن آن در
كلاسهاي tableadapter بي نياز مي
شويم و همچنين
اين مورد
اعمال تغييرات
احتمالي connection
string را در
آينده، آسان
مي نمايد. با
پذيرش ذخيره
سازي connection string در web.config
، vs آن را در
قسمت <connectionstring>
ذخيره مي
نمايد كه مي
توانيد آن را
به منظور ارتقاي
امنيت
رمزگذاري
نماييد.
شكل4:
ذخيره سازي connection
string در web.config
سپس
ما بايد طرح
اولين strongly_typed datatable را تعريف
نماييم و
اولين متد tableadapter را ايجاد
كنيم. با ايجاد
query كه نتيجه ي
آن
بازگرداندن
ستونهاي مورد
نظر از جدولي
كه مي خواهيم
در datatable منعكس
شود، مي باشد
اين دو مرحله
همزمان انجام
مي شوند. در
انتهاي wizard يك نام متد،
به اين query
نسبت مي دهيم.
اين متد مي
تواند از لايه
نمايش فراخواني
شود. اين متد query تعريف شده
در خود را اجرا
مي نمايد و
نتيجه را در strongly_typed
datatable
بارگذاري مي
نمايد.
براي
تعريف SQL query مي
توانيم يك
دستور خاص sql ايجاد
نماييم و يا
از يك stored procedure كه قبلا
تعريف شده است
استفاده
نماييم و يا يك
stored
procedure جديد
ايجاد نماييم.
شكل
5
زماني
كه اولين متد
را در tableadapter
تعريف مي
نماييم در
حقيقت مي
خواهيم
ستونهايي كه query
باز
ميگرداند در datatable مربوطه نشان
داده شود. query مورد نظر
ما در اين بخش
تمام سطرها و
ستونهاي جدول products را بازمي
گرداند.
شكل
6: وارد كردن sql
query در textbox
علاوه
بر تعريف query به صورت
دستي در
textbox مي توانيم
از querybuilder استفاده
نماييم و به
صورت گرافيكي query مورد نظر
را بسازيم
.
شكل7:
ايجاد query
به صورت
گرافيكي با
استفاده از query
editor
پس از
ايجاد query
و قبل از
اجراي مرحله
بعد دكمه advanced optiones كليك
نماييد. در
پروژه هاي وب
سايت گزينه
اول "Generate Insert، Update، and Delete statements" تنها گزينه
انتخاب شده به
صورت پيش فرض
مي باشد .
درپروژه هاي
ويندوز گزينه
دوم "Use optimistic concurrency" نيز به طور
پيش فرض
انتخاب شده
است.
شكل 8
با انتخاب
دكمه next
مرحله نهايي
ظاهر مي شود.
در اين قسمت
در مورد متدهايي
كه مي خواهيم
به tableadapter اضافه شود
سوال پرسيده
مي شود. دو
الگو به منظور
بارگذاري
داده وجود
دارد
1-
Fill a datatable :
با اين شيوه
متدي ايجاد مي
شود كه يك datatable به عنوان
يك پارامتر مي
پذيرد و بر
اساس نتيجه query ،datatable
را پر مي كند.
كلاس dataadapter
در ADO.NET اين روش را
با متدfill()
پياده سازي
مينمايد.
2-
Return a datatable:
با استفاده از
اين شيوه متد
ايجاد مي شود
و datatable را پر مي
كند و آن را به
عنوان مقدار
بازگشتي متد،
بازمي گرداند
مي توان يك
ويا هر دو
الگو را
استفاده
نمود.هم چنين
مي توانيم نام
متد ها را در
اين مرحله تغيير
دهيم. ما در
اين مرحله هر
دو checkbox را انتخاب
مي نماييم اما
در ادامه تنها
از الگوي دوم
استفاده مي
تماييم. و متد getdata را به getproducts تغيير نام
مي دهيم.
اگر checkbox سوم "GenerateDBDirectMethods،"
را انتخاب
نماييم
متدهاي insert()،update() وdelete() برايtableadapter ايجاد مي
شوند. اگر اين
گزينه انتخاب
نشود تمام به
روز رساني ها
بايد از طريق
متد update()
مربوط بهtableadapter اعمال
شوند.
در
صورتيكه
گزينه "Generate Insert، Update، and Delete statements"
را از advanced properties انتخاب
نكرده باشيد
تنظيمات
گزينه GenerateDBDirectMethods،"" بي
اثر خواهد
بود.
Wizard با كليك
كردن دكمه finish
به پايان مي
رسد. پس از
بسته شدن wizard، DataSet
Designer ، datatable كه هم
اكنون ايجاد
كرده ايم را
نشان ميدهد.
ليست ستونها
را در Products DataTable و به علاوه
متدهاي ProductsTableAdapter
(Fill() ,GetProducts()) را مي توان
مشاهده نمود.
اكنون يك typed
dataset به
همراه يك (Northwind.Products)
datatable و يك
كلاس tronglytypedDataAdapter
(NorthwindTableAdapters.ProductsTableAdapter) با متد GetProducts() داريم.
اين اشيا
مي توانند به
منظور
دستيابي به
ليست تمام
محصولات به
كار برده شوند
:
هر شي كه
در اين مثال
به كار برده
مي شود يك شي strongly_typed مي باشد و
به VS اجازه مي
دهد چك نوع ر ا
در زمان
كامپايل
انجام دهد. و
نيز datatable
بازگردانده
شده توسط tableadapter مي تواند
به تمام data web control ها مانند GridView,
DetailsView, DropDownList, CheckBoxList, نسبت
داده شوند. مثال
زير انقياد datatable بازگشتي
ازمتد getproducts()
به gridview نشان مي
دهد
مرحله
ي 3: افزودن
متدهاي با
پارامتر به
لايه ي Data Access
تا
اين مرحله،
كلاس ProductsTableAdapter فقط يك
متدGetProducts() داردكه
همه ي productهاي
پايگاه داده
را برمي
گرداند.ممكن
است بخواهيم
اطلاعات
مربوط به يك ProductProduct
هاي يك Category
(مقوله)خاص را
بازيابي
كنيم.براي
افزودن اين چنين
وظايفی (توابعي)
به لايه ي Data Access ، ميتوانيم
متدهايی با
پارامتر بهTableAdapter اضافه
كنيم.
خاص را بازيابي
كنيم يا همه ي
بياييد
متدGetProductsByCategoryID(categoryID) را اضافه
كنيم.جهت افزودن
متد جديد به DAL ، به DataSet Designer
برگرديد ، روي
قسمت ProductTableAdapter راست كليك
كنيد و Add Query را
انتخاب كنيد.
در
ابتدا بايد
مشخص كنيم ،که
از چه طريقي
به پايگاه
داده دسترسي
داشته باشيم:
از طريقad-hoc SQL statement يا
يك stored procedure جديد يا يك stored proceduread-hoc
SQL statement را
انتخاب
كنيم.سپس ازما
پرسيده مي شود
كه مايليد
كدام نوع SQL Query را
به كار گيريد؟
از آنجايي كه
ميخواهيم نام همه
ي Product هاي متعلق
به يك مقوله(category)
خاص را
برگردانيم، در
نتيجه يك عبارت(statement)select كه
سطر
برميگرداند
را مي نويسيم.
موجود؟ اجازه
دهيد
مرحله ي
بعد براي
تعريف SQL query
مورد استفاده
جهت دسترسي به
داده ها
است.از آنجايي
كه مي خواهيم
فقط محصولات
متعلق به يك
مقوله ي خاص
را بر گردانيم،
يك select statementGetProducts()را
استفاده مي
كنيم ، با اين
تفاوت كه در
قسمت where اين عبارت
را مي نويسيم:CategoryID=@CategoryID .پارامتر
CategoryID به
ويزارد TableAdapter
نشان مي دهد
كه اين متدي
كه ما ايجاد
كرده ايم به
يك پارامتر
ورودي از نوع
متناظر (مشخص
شده) نياز
دارد.(namely ، nullable integer ) مشابه متد
در مرحله ي
آخر ميتوانيم
انتخاب كنيم
كدام یک از الگو
هاي date access قابل
استفاده است. براي الگوی
Fill ، نام را به FillByCategoryID
تغيير دهيد
وبراي خروجی(return) الگو
يك DataTable (متدهاي GetX)،
از GetProductsByCategoryID استفاده
كنيد.
بعد از كامپايل
اين ويزارد ، DataSet Designer
شامل متدهاي TableAdapterجديد
است.
جهت
افزودن متد
GetProductByProductID(productID)نیز از همين
تكنيك
استفاده مي
شود.اين Query
هاي پارامتر
دار را مي
توان مستقيما
ازDataSet Designer آزمود.
برای این کار روي
متد در TableAdapter راست
كليك و Preview Data را
انتخاب كنيد، سپس
مقداري را
براي پارامتر
وارد كنيد و Preview
را كليك كنيد.
با متدGetProductsByCategoryID(categoryID) در DAL ، مي
توانيم يك
صفحه ي ASP.NET
ايجاد كنيم
كه فقط
محصولات با يك
category مخصوص را
نشان دهد. مثال
زير تمامی
محصولاتي كه
در مقوله ي
(گروه) Beverages
هستند و CategoryID
مساوي 1 دارند ،
را نشان مي
دهد.
|
Beverages.aspx
<%@ Page
Language="C#" AutoEventWireup="true"
CodeFile="Beverages.aspx.cs"
Inherits="Beverages"
%>
<!DOCTYPE
html PUBLIC "//
W3C//DTD XHTML
1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.
dtd">
<html
xmlns="http://www.w3.org/1999/xhtml" >
<head
runat="server">
<title>Untitled
Page</title>
<link
href="Styles.css" rel="stylesheet"
type="text/css" />
</head>
<body>
<form
id="form1" runat="server">
<div>
<h1>Beverages</h1>
<p>
<asp:GridView
ID="GridView1" runat="server"
CssClass="DataWebControlStyle">
<HeaderStyle
CssClass="HeaderStyle" />
<AlternatingRowStyle
CssClass="AlternatingRowStyle" />
</asp:GridView>
</p>
</div>
</form>
</body>
</html>
|
|
Beverages.aspx.cs
using System;
using
System.Data;
using
System.Configuration;
using
System.Collections;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
NorthwindTableAdapters;
public partial
class Beverages : System.Web.UI.Page
{
protected void
Page_Load(object sender، EventArgs e)
{
ProductsTableAdapter
productsAdapter = new
ProductsTableAdapter();
GridView1.DataSource
=
productsAdapter.GetProductsByCategoryID(1);
GridView1.DataBind();
}
}
|
مرحله ي 4:Insert ، Update ، Delete
كردن داده ها
به طور
معمول ، دو الگو
براي insert ، update وdelete
داده ها
استفاده مي
شود. الگو اول،
كه ما آن را الگو
مستقيم
ديتابيس مي
ناميم، درگير
ساختن
متدهايي است
كه وقتي
درخواست مي شوند
، يك دستورupdate ، insert يا delete
كه تنها روي
يك ركورد
ديتابيس عمل
مي كند، را به
ديتابيس صادر
مي كنند. به
این متدها مقادیری
پاس داده مي
شوند (integer ، string ، Boolean، ِDataTime و...)
كه متناظر با
مقدارهاي
مورد نیاز
برای Insert ، update
يا delete است. براي
مثال، با اين الگو
براي جدولProducts ، متد delete
يك مقدارinteger را به عنوان
پارامتر مي
گيرد، و ProductID
ركوردي را كه
بايد حذف شود
را نشان مي
دهد. متد insert
يك مقدار String
را برايProductName
مي گيرد، يك
مقدار decimal براي UnitPrice ، يك مقدارinteger
براي UnitOnStockو....
الگو ديگر،
كه ما به آن الگو
گروهی می
گوییم(batch update) است. این
الگو ، جهت Update
كردن يك DataSet ،ِDataTable ، يا مجموعه
ای از DataRow ها در
فراخواني يك
متد، بكار مي
روند. با اين الگو
يك developer ، DataRow
ها را در يكDataTable ،update ، insert يا delete مي كند.سپس
اين متد
يكايك DataRow هاي
پاس داده شده
را مي شمرد،
تعيين مي كند
آيا ويرايش،
افزودن يا
حذفي داشته
ايم يا
خير(توسط
مقدار خصوصیت RowState )،
و براي هر ركورد،
عملیات مناسب را
صادر ميكند.
TableAdapter به طور پيش
فرض از الگو batch update
استفاده مي
كند.اما الگو DBdirect
را نیز
پشتيباني
ميكند. از
آنجايي كه
گزينه ي"Generate Insert،Update،and Delete statements"
را از Advanced
Propertise در
زمان ايجاد TableAdapter ، انتخاب
كرديم، ProductsTableAdapter
شامل يك متدupdate()
است كه الگوbatch update را
پياده سازي مي
كند.به طور
مشخص، TableAdapter شامل يك
متد Update()Typed DataSet ، يك Strongly-typed DataTable با يك يا چند DataRow را پاس دهد.
اگر
chechbox
"GenerateDBDirectMethods"را علامت
بزنيد، وقتي
كه براي اولين
بار TableAdapter ايجاد مي
كنيد، الگوDB direct
نيزتوسط
متدهاي insert() ، update() و delete() پياده
سازي خواهد
شد.
است كه
ميتواند
هر دو الگو
تغيير و تبديل
داده از خصوصیت
های InsertCommand، UpdateCommand وDeleteCommand TableAdapter براي صدور
دستورات INSERT،UPDATE
و DELETE
آنها به
پايگاه داده ،
استفاده مي
كنند.
شما مي
توانيد خصوصیت
هاي InsertCommand، UpdateCommand و DeleteCommand را با كليك
كردن روي TableAdapter
در DataSet Designer و با رفتن
به Properties window ،
ويرايش
كنيد.(مطمئن
شويد كه
TableAdapter
را انتخاب
كرده ايد، و
شي ProductTableAdapter در Properties
Window
انتخاب شده
است)
براي
آزمايش يا
ويرايش command properties پايگاه داده
، روي subproperty ، commandText
كليك كنيد. اين
كار باعث مي
شود كه پنجره
ي Query Builder ظاهر شود.
كدي كه در
ادامه نوشته
شده است نشان
مي دهد كه چگونه
از الگوbatch update
براي اضافه
كردن قيمت همه
ي محصولاتي كه
discontinued
نيستندو 25
واحد يا كمتر
درموجودي
داشته باشد،
را نشان مي
دهد.
|
NorthwindTableAdapters.ProductsTableAdapter
productsAdapter =
new
NorthwindTableAdapters.ProductsTableAdapter();
// For each product،
double its price if it is not discontinued and
// there are 25 items in stock or less
Northwind.ProductsDataTable products =
productsAdapter.GetProducts();
foreach (Northwind.ProductsRow product
in products)
if (!product.Discontinued &&
product.UnitsInStock <= 25)
product.UnitPrice *= 2;
// Update the products
productsAdapter.Update(products);
|
كد زير
چگونگي
استفاده از الگو
DB direct
براي delete يكProduct مشخص و سپس
update و بعد افزودن
يك محصول
جديد از طريق
برنامه نويسي را
نشان مي دهد.
|
NorthwindTableAdapters.ProductsTableAdapter
productsAdapter =
new
NorthwindTableAdapters.ProductsTableAdapter();
// Delete the
product with ProductID 3
productsAdapter.Delete(3);
// Update Chai
(ProductID of 1)، setting the UnitsOnOrder to 15
productsAdapter.Update("Chai"،
1، 1، "10 boxes x 20 bags"،
18.0m،
39، 15، 10، false، 1);
// Add a new
product
productsAdapter.Insert("New
Product"، 1، 1،
"12 tins per carton"،
14.95m، 15، 0، 10، false);
|
ايجاد
متدهاي insert, update, delete
به صورت
سفارشي
به منظور
ايجاد يك متد
سفارشي، به DataSet
Designer بازمي
گرديم. بر روي tableadapter
راست كليك
نموده و گزينه
ي Add
query را
انتخاب مي
نماييم، wizard مربوط به tableadapter آغاز مي
شود. در صفحه ي
دوم نوع query را كه مي
خواهيم ايجاد
نماييم، را
مي توانيم
انتخاب كنبم.
مي خواهيم يك
متد كه يك
محصول جديد را
به جدول اضافه
نمايد و productidمربوط
به سطر اضافه
شده را بر
گرداند،
ايجاد نماييم.
بنابراين
گزينه ي insert را
انتخاب مي نماييم.
در صفحه
بعد commandtext
مربوط به
دستور insert ظاهر مي شود.
اين دستور را
با اضافه كردن
SELECTSCOPE_IDENTITY() به انتهاي query تكميل مي
نماييم. اين
دستور identity
مربوط به سطر
اضافه شده را
بازمي گرداند(
;
قبل از دستور select الزامي
است)
در نهايت query جديد
راInsertProduct نامگذاري
مي نماييم
زمانيكه
به dataset
designer باز مي
گرديم متد
جديد به ProductsTableAdapter اضافه شده
است. به صورت
پيش فرض executemode مربوط به متدهاي
insertnonquery
مي باشد. بدین
معنا كه تعداد
ركوردهاي
تغيير يافته
را باز مي
گردانند. در
اين متد خاص
مي خواهيم متد
مقدار
بازگشتي queryرا
بازگرداند،
بدين منظور
خاصيت ExecuteMode
مربوط به متد
را به scalar
تغيير مي
دهيم. ،
كد زير
استفاده از
متد InsertProduct
را در عمل
نشان مي دهد
مرحله
ي 5 :كامل
كردن لايه ي Data Access
توجه كنيد
كه كلاس ProductsTableAdapters مقدارهايCategoryID
وSupplierId را از جدول Productبرمي
گرداند، شامل
ستونCategorysName از جدول Categoriesيا
ستون CompanyName از جدول Suppliers
نمي باشد، اما
در هنگام نشان
دادن اطلاعات product ،مي خواهيم
آنها (CompanyName، CategoryName) را
نيز نشان
دهيم. ما مي
توانيم GetProducts()
را به متد initial
يك TableAdapter بيفزاييم
تا با به روز
رساني strongly-typed Data Table ،شامل
مقدارستونهاي
جديد CompanyName وCategoryName باشد .
اين راه حل
مي تواند
مشكلي را
ايجاد كند،
هرچند كه، متدهايTableAdapter
براي insert،update و deleteبر
اساس این متد
مقدار دهی
اولیه می شوند.
خوشبختانه،
متدهایي كه به
طور خودكار
براي insert،update وdelete ايجاد
ميشوند تحت
تاثيرsubquery ها در شرطSelect
نيستند. با
توجه به این
مسئله و با
احتیاط می
توان با
افزودن query هايمان
به Categories و بصورت subquery، به
غیر از
استفاده joins ،
می توان از
دوباره نوشتن متدهایی
که برای
ویرایش داده
ها بکار می
روند، اجتناب کرد.
روي متد GetProducts() در
ProductsTableAdapterراست
كليك كنيد و
گزينه ي Configure
را انتخاب كنيد.
سپس ،
شرط select را مانند
آنچه در زير
مي بينيد
تنظيم كنيد: Suppliers
|
SELECT
ProductID، ProductName، SupplierID، CategoryID،
QuantityPerUnit،
UnitPrice، UnitsInStock، UnitsOnOrder، ReorderLevel، Discontinued،
(SELECT
CategoryName FROM Categories
WHERE
Categories.CategoryID = Products.CategoryID) as CategoryName،
(SELECT
CompanyName FROM Suppliers
WHERE
Suppliers.SupplierID = Products.SupplierID) as SupplierName
FROM
Products
|
بعد
از تغيير متد
جهت استفاده
از اين query ، DataTable
دو ستون جديد
را نشان خواهد
داد: CategoryNameوSupplierName .
حال
کمی وقت
بگذارید و شرط
select در
متد GetProductsByCategoryID(categoryID) را
نيز تصحیح كنيد.
اگر select متدGetProducts()
را با
استفاده از join ، updateمي كرديد ، DataSet Designer
توانايي
ايجاد خودكار(auto-generate)متدهايي
براي insert،update و delete
داده هاي
پايگاه داده
با استفاده از
الگوي(pattern)DB direct را
نداشت. در عوض،
شما مي توانيد
آنها را به
طور دستي
مانند آنجه
براي متدInsertProduct()
انجام داديم،
ايجاد كنيد.
اگر مي خواهيد
از الگوي به
روز رساني
دسته اي(batch updating
pattern) استفاده
كنيد، مي
توانيد مقدار خاصیت
هايInsertCommand ،UpdateCommand و DeleteCommand را به طور
دستي آماده
كنيد (ايجاد
كنيد).
اضافه
كردن TAbleAdapter هاي باقي
مانده
تا
الان ، ما فقط
با يكTableAdapter
براي يك جدول
پايگاه داده كار
كرديم. پايگاه
داده ي NorthWind
جدولهاي
زيادي دارد كه
ما در طي
پروژه با آنها
كار میكنيم.
يك DataSet مي
تواند شامل
چندين DataTable مرتبط باشد .بنابراين
، براي كامل
كردنDAL
لازم است كه DataTable
هاي ديگر را
اضافه كنيم.
بعد
از ايجادDataTable
ها متد هاي لازم
را به هر table
بيافزاييد.
l ProductsTableAdapter
¡ GetProducts:
SELECT
ProductID، ProductName، SupplierID، CategoryID،
QuantityPerUnit،
UnitPrice، UnitsInStock، UnitsOnOrder،
ReorderLevel،
Discontinued ، (SELECT CategoryName FROM
Categories
WHERE Categories.CategoryID =
Products.CategoryID)
as CategoryName، (SELECT CompanyName
FROM Suppliers
WHERE Suppliers.SupplierID =
Products.SupplierID)
as SupplierName
FROM Products
¡ GetProductsByCategoryID:
SELECT
ProductID، ProductName، SupplierID، CategoryID،
QuantityPerUnit،
UnitPrice، UnitsInStock، UnitsOnOrder،
ReorderLevel،
Discontinued ، (SELECT CategoryName FROM
Categories
WHERE Categories.CategoryID =
Products.CategoryID)
as CategoryName،
(SELECT
CompanyName FROM Suppliers WHERE
Suppliers.SupplierID
= Products.SupplierID) as SupplierName
FROM Products
WHERE
CategoryID = @CategoryID
GetProductsBySupplierID
SELECT
ProductID، ProductName، SupplierID، CategoryID،
QuantityPerUnit،
UnitPrice، UnitsInStock، UnitsOnOrder،
ReorderLevel،
Discontinued ،
(SELECT
CategoryName FROM Categories WHERE
Categories.CategoryID
= Products.CategoryID)
as
CategoryName، (SELECT CompanyName FROM Suppliers
WHERE
Suppliers.SupplierID = Products.SupplierID)
as
SupplierName
FROM Products
WHERE
SupplierID = @SupplierID
¡ GetProductByProductID
SELECT
ProductID، ProductName، SupplierID، CategoryID،
QuantityPerUnit،
UnitPrice، UnitsInStock، UnitsOnOrder،
ReorderLevel،
Discontinued ، (SELECT CategoryName
FROM
Categories WHERE Categories.CategoryID =
Products.CategoryID)
as CategoryName،
(SELECT
CompanyName FROM Suppliers
WHERE
Suppliers.SupplierID = Products.SupplierID)
as
SupplierName
FROM Products
WHERE
ProductID = @ProductID
l CategoriesTableAdapter
¡ GetCategories
SELECT
CategoryID، CategoryName، Description
FROM
Categories
¡ GetCategoryByCategoryID
SELECT CategoryID، CategoryName، Description
FROM Categories
WHERE CategoryID =
@CategoryID
l SuppliersTableAdapter
¡ GetSuppliers
SELECT
SupplierID، CompanyName، Address، City،
Country،
Phone
FROM Suppliers
¡
GetSuppliersByCountry
SELECT
SupplierID، CompanyName، Address،
City،
Country،
Phone
FROM Suppliers
WHERE Country
= @Country
¡ GetSupplierBySupplierID
SELECT
SupplierID، CompanyName، Address،
City،
Country،
Phone
FROM Suppliers
WHERE
SupplierID = @SupplierID
l EmployeesTableAdapter
¡ GetEmployees
SELECT
EmployeeID، LastName، FirstName،
Title،
HireDate، ReportsTo، Country
FROM Employees
¡ GetEmployeesByManager
SELECT
EmployeeID، LastName، FirstName،
Title،
HireDate، ReportsTo، Country
FROM Employees
WHERE
ReportsTo = @ManagerID
¡ GetEmployeeByEmployeeID
SELECT
EmployeeID، LastName، FirstName،
Title،
HireDate، ReportsTo، Country
FROM Employees
WHERE
EmployeeID = @EmployeeID
|
اضافه
كردن كد
سفارشي به DAL
TableAdapter ها و DataTable ها ي
اضافه شده به DataSet
در يك فايل با
شمايXML بيان شده
اند. ميتوانيد
اين اطلاعات
را با راست
كليك روي فايل
NorthWind.xsd در Solution
ExplorerوانتخابView Code ، ببينيد.
اطلاعات
مربوط به اين
شما در زمان
طراحي هنگامي
كه كامپايل مي
شوند و يا در
زمان اجرا (در
صورت نياز) به c# و
يا visual basic
ترجمه مي شود.
براي مشاهده ي
اين كدها كه
به صورت خودكار
ايجاد شده اند
به class view رفته و
كلاسهاي tableadapter
ويا typed dataset را انتخاب
نماييد. با
استفاده از class view
مي توانيد
خواص، متدها و
يا رويدادهاي
مربوط به
كلاسهاي tableadapter
ويا typed datasetرا مشاهده
نماييد. براي
مشاهده ي يك
كد متد خاص بر
روي نام آن در class view دو بار كليك
نماييد و يا
بر روي آن
راست كليك نموده
و گزينه ي go to definition
را انتخاب
نماييد.
با
وجود اينكه
توليد خودكار
كدها باعث
صرفه جويي در
وقت مي شود
اما اين كدها
معمولا بسيار
كلي هستند و
به منظور برآورده
ساختن
نيازمنديهاي
خاص يك برنامه
احتياج به
سفارشي كردن
دارند. ريسك
سفارشي كردن و
دستكاري
كدهايي كه به
صورت خودكار
توليد مي شوند
در اين مسئله
است كه ابزاري
كه كد را به
صورت خودكار
توليد نموده
است ممكن است
تصميم به
توليد دوباره
آن بگيرند و
كدي كه سفارشي
شده است را
تغيير دهد.
مفهوم
كلاسهاي partial در .NET 2.0
شكستن يك كلاس
در قالب
به منظور
نشان دادن
نحوه ي سفارشي
كردن DAL ، متد getproducts()
را به كلاس suppliersrow
اضافه مي
نماييم. كلاس suppliersrow
يك سطر در
جدول suppliers را نشان مي
دهد. هر
فروشنده مي
تواند صفر يه
چند محصول را
فراهم نمايد.
بنا بر اين getproducts()
محصولاتي
فروشنده خاص
را باز مي
گرداند. بدين
منظور يك class file
در پوشه ي App_Code SuppliersRow.cs
مي گذاريم و
كدهاي زير را
به آن اضافه
مي نماييم:
ايجاد نموده و
نام آن را
اين كلاس
جزئي در هنگام
ساخت كلاس Northwind.SuppliersRow به
كامپايلر مي
گويد متد getproducts() تعريف شده
را نيز در نظر
بگيرد.
اكنون مي
توان از متد getproducts() به منظور
محاسبه
محصولات يك
فروشنده خاص
استفاده
نماييم.
اين داده
مي تواند در
هر data
web control نشان
داده شود.
صفحه ي زير از
يك GridView با
دو فيلد
استفاده مي
نمايد.
·
يك BoundField كه
نام هر
فروشنده را
نشان مي دهد
·
يك TemplateField
كه شامل كنترل BulletedList
مي باشد كه
نتيجه ي
بازگشتي از getproducts() براي هر
فروشنده به آن
نسبت داده مي شود
اين مثال
نحوه ي
استفاده از
متد سفارشي
اضافه شده به
كلاس Northwind.SuppliersRow را نشان مي
دهد.

خلاصه
زمانیکه
یک برنامه وب
ایجاد می کنید
DAL باید
اولین گام
باشد و باید
قبل از ایجاد
لایه نمایش
قرار گیرد. با
استفاده از visual
studio،
تولید DAL بر اساس Typed
DataSets کاری
است که باید 10
تا 15 دقیقه از
وقت شما را
بگیرد که نیاز
به نوشتن کدی
ندارد.
http://download.microsoft.com/download/5/d/7/5d7571fc-d0b7-4798-ad4a-c976c02363ce/ASPNET_Data_Tutorial_1_VB.exe
http://download.microsoft.com/download/4/6/3/463cf87c-4724-4cbc-b7b5-3f866f43ba50/ASPNET_Data_Tutorial_1_CS.exe