صفحه اول سایت arrow کامپیوتر و فناوری اطلاعات arrow آموزش زبان برنامه نویسی #C قسمت اول : چگونگی ساخت Data Access Layer

Ads by ganjineh.co.ir

- برای مشاهده تمام مقالات موجود در سایت و استفاده از تالار گفتمان لطفا با نام کاربری خود وارد شوید در صورتی که عضو نیستید < اینجا > کلیک کنید.


آموزش زبان برنامه نویسی #C قسمت اول : چگونگی ساخت Data Access Layer چاپ ارسال برای دوستان
(15 :مجموع راي ها)
فرستادن :
Mohand.es
Balatarin
Donbale
نوشته شده توسط بهزاد عبدالله زاده   
f13bce490af4b516df0c0a8e0ac9288d

مقدمه

به عنوان یک برنامه نویس وب ، بیشتر زندگی ما در کنار کار با داده ها می گذرد. معمولا دیتابیسی برای ذخیره داده ها ، کد هایی برای بازیابی و ویرایش داده ها و صفحاتی برای نشان داده ها ایجاد می کنیم. این اولین مجموعه ای از آموزش ها است که در طی یک سری مقالات یکپارچه ، به ارائه تکنیک هایی برای پیاده سازی هر چه بهتر این الگو های معمول،  در 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 
نظرات
افزودنجستجو
Masoumeh (85.185.102.18) ۰۲ آبان ۱۳۸۶ , ۱۴:۲۵

عالی بود.امیدوارم از این بهتر هم بشه و موفق باشید
محمد احمدي (91.98.170.175) ۱۰ دي ۱۳۸۶ , ۱۸:۵۲

با سلام و خسته نباشيد
واقعاً لذت بردم ؛ عالي بود خيلي خيلي ممنونم از شما
اميدوارم در زمينه هاي مختلف نرم افزار كامپيوتر مطالب ارزنده و پرمحتوا از شما سازنده و گردآورنده ي اين سايت ببينيم
باز هم تشكر
موفق و پاينده باشيد
پرسش
فاطمه (81.28.44.138) ۰۸ ارديبهشت ۱۳۸۷ , ۰۷:۴۵

با سلام و سپاس از مطالب گفته شده
در فرمی که با سی شارپ نوشته ام دکمه ی "ذخیره کن" هست حتما باید اسکیو ال را برای بخش پایگاه داده روی سیتم نصب کنم یا نه و کدنویسی سی شارپ کافیه یا باید در اس کیو ال هم برنامه بنویسم
این فرم فعلا با فرم دیگه ای ارتباط نداره وفقط لازمه یک جدول ایجاد کنم اگر میشه منو راهنمایی کنید
موفق باشید
مرسی
مهدی (217.219.137.27) ۱۵ ارديبهشت ۱۳۸۷ , ۱۴:۲۰

بابا دمت گرم خیلی توپ بود.
مطالب زیلدی یاد گرفتم.
مرسییییییی
یی
تنها کاربران عضو توانايي ارسال نظر را دارند.

Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved.

 
فرستادن :
Mohand.es
Balatarin
Donbale

Ads by ganjineh.co.ir

Creative Commons License
کلیه مقالات پایگاه علمی همکلاسی تحت مجوز Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License منتشر می‌گردد.

Template Designed by : Template Design Workshop
Template name : Hamkelasy Template
Designed by : Template Design Workshop

Template Design Workshop offers professional web templates, flash templates and other web design products available for immediate download.

PictoFX Multimedia Design Group Medium Blog Template Design Workshop
pictofxt