برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

Error Handling در ASP.NET

خطاء‌ و یا Error از جمله واژه های معروف در ادبیات برنامه نویسی است که هر برنامه نویس صرفنظر از میزان مهارت خود با آن مواجه خواهد شد . پیاده کنندگان برنامه های وب نیز از این قاعده مستثنی نبوده و ممکن است در زمان پیاده سازی این نوع برنامه ها با مجموعه ای از خطاها برخورد نمایند . علاقه مندانی که پلت فرم مایکروسافت را برای طراحی و پیاده سازی برنامه های وب انتخاب نموده اند ( ASP.NET ) ،‌ می توانند با استفاده از امکانات موجود با خطاها برخورد و آنان را مدیریت نمایند .
پس از بروز خطاء در یک صفحه ، ASP.NET اطلاعات مربوط به خطاء را برای سرویس گیرنده ارسال می نماید . یک صفحه وب ASP.NET ممکن است در زمان اجراء به یکی از خطاهای زیر برخورد نماید :

*

خطاهای پیکربندی : زمانی که گرامر و یا ساختار فایل web.config نادرست باشد ، ایجاد می گردند .
*

خطاهای پارسر : زمانی که گرامر ASP.NET بر روی یک صفحه نادرست باشد ، ایجاد می گردند .
*

خطاهای ترجمه : زمانی که عبارات و دستورات نوشته شده در صفحات متناسب با گرامر زبان استفاده شده نباشند ،‌ ایجاد می گردند .
*

خطاهای زمان اجراء : در زمان اجرای یک صفحه ایجاد می گردند .

پس از بروز یک خطاء‌ ،‌ به صورت پیش فرض اطلاعات موجود در Stack که حاوی فراخوانی ترتیبی مجموعه ای از روتین ها است ، نمایش داده می شود . در صورتی که debug mode فعال شده باشد ،‌ ASP.NET شماره خط بروز خطاء در کد منبع را که باعث بروز خطاء ‌شده است را نمایش خواهد داد . debug mode یک ابزار ارزشمند برای اشکال زدائی برنامه ها می‌باشد .

فعال کردن debug mode در سطح page : بدین منظور از دایرکتیو زیر استفاده می گردد :

<%@ Page Debug="true" %>

فعال کردن debug mode در سطح Application : بدین منظور از فایل Web.config موجود در فهرست ریشه application استفاده می گردد :







اثرات جانبی فعال کردن debug mode
فعال کردن debug mode کارآئی سیستم را کاهش و افزایش حجم عملیات سیستم را به دنبال خواهد داشت ، بنابراین لازم است پس از اتمام فرآیند پیاده سازی نرم افزار و نصب در محیط عملیاتی ، آن را غیرفعال نمود . پس از فعال شدن debug mode در صورت بروز خطاء‌ ، شماره خط به همراه جزئیات مربوطه نمایش داده می شود .

سفارشی کردن صفحات خطاء
برای برخورد با خطاء از روش های متفاوتی استفاده می گردد. مثلا" در زمان پیاده سازی لازم است جزئیات مربوط به خطاء نمایش داده شود تا بتوان اشکالات موجود را سریعا" تشخیص و برطرف نمود . بدیهی است پس از آماده شدن برنامه و نصب در محیط عملیاتی ،‌ضرورتی به نمایش جزئیات خطاء وجود نخواهد داشت . در چنین مواردی می توان با استفاده از امکانات موجود تمهیداتی را اتخاذ نمود که محل بروز خطاء به سرویس گیرندگان محلی ، راه دور و یا هر دو نمایش داده شود . در زمان بروز خطاء به صورت پیش فرض، اطلاعات مربوط به خطای ایجاد شده صرفا" برای سرویس گیرندگان محلی ( سرویس گیرندگانی که برنامه را مستقیما" از طریق کامپیوتر سرویس دهنده اجراء می نمایند ) ،‌ نمایش داده می شود . در چنین مواردی می توان یک صفحه خطاء سفارشی را ایجاد تا در صورت بروز خطاء ، سرویس گیرندگان به آن صفحه هدایت گردند .
برای فعال کردن خطاهای سفارشی از امکانات موجود در فایل Web.Config استفاده می گردد . کد زیر نحوه انجام این کار را نشان می دهد :

Web.Config







پیکربندی فوق باعث نمایش جزئیات خطاء برای سرویس گیرندگان محلی می گردد ولی سرویس گیرندگان از راه دور به یک صفحه خطاء سفارشی هدایت خواهند شد ( DefaultErrorPage.htm ) . صفحه فوق می‌ تواند یک صفحه aspx . نیز باشد .
ASP.NET مسیر صفحه ای‌ را که باعث بروز خطاء‌ شده است را به عنوان یک آرگومان QueryString برای صفحه خطاء ارسال می نماید(ErrorPage ). در صورتی که صفحه سفارشی خطاء‌ خود دارای یک خطاء‌ باشد ، یک صفحه خالی برای سرویس گیرندگان از راه دور ارسال می گردد .

DefaultErrorPage.htm

<%@ Page Language="VB" Description="Error page"%>


صفحه خطاء


بروز خطاء در صفحه : <%=Request.QueryString("ErrorPage") %>



توجه داشته باشید که صرفا" فایل هائی که به aspnet_isapi.dll در IIS نسبت و یا map شده اند، خطای فوق را تولید خواهند کرد و فایل هائی که به aspnet_isapi.dll نسبت داده نشده اند ، توسط ASP.NET پردازش نشده و مسئولیت ارائه خطاء‌ برعهده IIS خواهد بود .
جدول زیر خصلت های پیکربندی و مقادیر مجاز برای تگ را نشان می دهد :
خصلت شرح
mode

فعال بودن ،‌ غیر فعال بودن و یا نمایش صفحه سفارشی خطاء صرفا" برای کامپیوترهای راه دور را مشخص می نماید.
مقدار نسبت داده شده به خصلت فوق on , off و یا reamoteOnly می باشد ( مقدار پیش فرض RemoteOnly است )
defaultRedirect

نام صفحه سفارشی خطاء را مشخص می نماید .

با توجه به مقدار نسبت داده شده به خصلت Mode ، در خصوص نمایش خطاء برای سرویس گیرندگان راه دور ، محلی و یا هر دو تصمیم گیری می شود . جدول زیر مقادیر نسبت داده شده به خصلت Mode و تاثیر آن بر روی درخواست های محلی و از راه دور را نشان می دهد .
Mode درخواست های محلی درخواست های از راه دور
On

نمایش صفحه سفارشی خطاء


نمایش صفحه سفارشی خطاء
Off نمایش صفحه خطاء ASP.NET

نمایش صفحه خطاء ASP.NET
RemoteOnly نمایش صفحه خطاء ASP.NET

نمایش صفحه سفارشی خطاء

مثال : نحوه استفاده از

*

مرحله اول : پیکربندی لازم در فایل Web.Config

Web.Config







*

مرحله دوم : ایجاد صفحه سفارشی خطاء

DefaultErrorPage.htm



بروز اشکال در برنامه



اشکال در صفحه درخواستی



در حال حاضر امکان پاسخ به درخواست شما وجود ندارد ،
لطفا" اشکال ایجاد شده را از طریق آدرس
info@srco.ir
به اطلاع مدیریت سایت سخاروش برسانید .






پس از ایجاد مراحل فوق ، در صورت بروز خطاء ( عدم وجود فایل ، بروز اشکال بر روی سرویس دهنده و یا سایر خطاهای متداول در صفحه درخواستی ) ، فایل DefaultErrorPage.htm نمایش داده می شود .



صفحه سفارشی خطاء با نام DefaultErrorPage.htm که در مثال قبل ایجاد شده بود برای تمامی موارد خطاء نمایش داده می شود . در صورت تمایل می توان برای هر نوع خطاء یک صفحه خاص را طراحی تا پس از بروز خطاء نمایش داده شود . بخش پیکربندی دارای یک تگ داخلی با نام است که مرتبط با کدهای وضعیت HTTP می باشد .











جدول زیر خصلت ها و مقادیر مربوط به تگ را نشان می دهد :
خصلت شرح
StatusCode

کد وضعیت خطاء HTTP را که می بایست توسط صفحه سفارشی خطاء استفاده گردد ، مشخص می نماید .
مثلا" کد 403 مربوط به خطاء Forbidden ، کد 404 برای مواردی که فایل درخواستی موجود نباشد و یا کد خطاء 500 برای مواردی که خطاء در ارتباط با سرویس دهنده باشد .
Redirect

آدرس و نام صفحه سفارشی مرتبط با نوع خطاء را که می بایست پس از بروز خطاء نمایش داده شود را مشخص می نماید .

مدیریت خطاء‌ از طریق کد برنامه
با استفاده از امکانات موجود در ASP.NET می توان از طریق کد نوشته شده با خطاء برخورد نمود ( هم در سطح page و هم در سطح application ) .

*

Page Level : کلاس پایه page دارای متدی با نام Page_Error است که می توان آن را در صفحات استفاده نمود .

Page Level



*

Application Level : از رویداد Application_Error در فایل Global.aspx استفاده می گردد . پس از بروز هر نوع خطای غیرقابل پیش بینی رویداد فوق فعال می گردد.

Application Level

Sub Application_Error(sender As Object, e As EventArgs)
'...عملیات مورد نظر
End Sub

بازیابی Scalar Data با استفاده از Stored Procedure

بانک های اطلاعاتی دارای نقشی اساسی در اکثر برنامه های کامپیوتری بوده و برنامه های وب نیز از این قاعده مستثنی نمی باشند . اکثر برنامه های وب نوشته شده با استفاده از ASP.NET در سطوح متفاوتی از بانک های اطلاعاتی استفاده می نمایند . یکی از متداولترین بانک های اطلاعاتی که در برنامه های وب ASP.NET از آن در ابعاد بسیار گسترده ای استفاده می گردد ، SQL Server متعلق به شرکت مایکروسافت است . در بانک های اطلاعاتی رابطه ای نظیر SQL Server ، دستورات ( نظیر SELECT ,INSERT ,UPDATE و DELETE ) با استفاده از یک گرامر مبتنی بر SQL نوشته می گردند که عموما" در این رابطه از دو روش استفاده می گردد :

*

ad-hoc queries : یکی از روش های صدور دستورات SQL ، استفاده از query مورد نظر در متن برنامه است . به دستورات فوق ، ad-hoc queries گفته می شود . مهمترین چالش اینگونه query ها ، نگهداری و پشتیبانی آنان است . در صورت نیاز به تغییر query ، می بایست رشته موجود در برنامه را ویرایش ،‌ ترجمه و مجددا" آن را بکارگرفت .
*

Stored procedure ، توابع از قبل ترجمه شده ای می باشند که بر روی سرویس دهنده بانک اطلاعاتی مستقر و امکان فراخوانی آنان از طریق نام مربوطه فراهم می گردد . عملکرد stored procedures مشابه ماژولار نمودن قابلیت های برنامه نویسی در متدها می باشد . stored procedures علاوه بر این که دارای قابلیت های بمراتب بیشتری از بعد ویرایش نسبت به ad-hoc queries می باشند ، امکان استفاده از آنان در سایر برنامه ها نیز وجود خواهد داشت. مثلا" ممکن است در یک برنامه ASP.NET و سرویس وب با استفاده از چندین query از داده های موجود در یک بانک اطلاعاتی مشابه استفاده گردد . در صورتی که هر query مستقیما" در متن برنامه استفاده شده باشد ، برای اعمال تغییرات می بایست بر روی دو تقطه متمرکز گردید : محل استفاده از query در برنامه ASP.NET و مکانی که از query در سرویس وب استفاده شده است . پس از اعمال تغییرات لازم در هر یک از مکان های اشاره شده ، می بایست آنان را مجددا" ترجمه و بکار گرفت . در صورت استفاده از stored procedure ، صرفا" اعمال تغییرات مورد نظر در یک نقطه انجام خواهد شد .
stored procedure معمولا" resultset برمی گرداند ( نظیر نتایج حاصل از اجرای یک SELECT query ) . در برخی موارد لازم است که داده scalar از یک stored procedure برگردانده گردد . مثلا" ممکن است دارای یک stored procedure باشیم که صرفا" مانده حساب یک مشتری خاص را برگرداند و یا در بانک اطلاعاتی دانشجویان که نمرات یک درس خاص ذخیره شده است ، قصد بازیابی معدل کلاس را داشته باشیم . در مواردی که از یک stored procedure برای درج یک رکورد جدید درون یک جدول که دارای یک فیلد اطلاعاتی با ویژگی IDENTITY است، استفاده شده باشد ، می توان ID رکورد جدید را برگرداند .

برای بازیابی داده scalar از طریق stored procedure از روش های متعددی استفاده می گردد . در ادامه با برخی روش های موجود در این رابطه و نحوه استفاده از نتایج مربوطه در برنامه های ASP.NET آشنا خواهیم شد .

برگرداندن داده با استفاده از یک عبارت SELECT
معمولا" با استفاده از یک عبارت SELECT داده ها از یک stored procedure که عموما" به صورت یک resultset می باشد ، برگردانده می شوند . resultset ، شامل چندین فیلد و رکورد می باشد. مثلا" stored procedure زیر مشخصات کالاهای موجود در یک انبار را برمی گرداند :

CREATE PROCEDURE store_GetInventory AS

SELECT InventoryID, ProductName, Price, UnitsOnStock
FROM store_Inventory

در صورت تمایل می توان یک مقدار scalar را با استفاده از یک stored procedure برگرداند . مثلا" فرض کنید که قصد بازیابی میانگین قیمت محصولات موجود در انبار را با استفاده از یک stored procedure داشته باشیم . بدین منظور می توان از یک عبارت SELECT به منظور برگرداندن مقدار داده مورد نظر استفاده نمود :

CREATE PROCEDURE store_GetAverageInventoryPrice AS

SELECT AVG(Price) AS AveragePrice
FROM store_Inventory

در صورتی که با استفاده از stored procedure یک رکورد جدید را در جدولی که دارای یک فیلد با ویژگی IDENTITY است اضافه نمائیم ، می توان ID رکورد جدید را با استفاده از تابع SCOPE_IDENTITY برگرداند :

CREATE PROCEDURE store_AddNewInventoryItem
(
@ProductName nvarchar(50),
@Price money
) AS

-- INSERT the new record
INSERT INTO store_Inventory(ProductName, Price)
VALUES(@ProductName, @Price)

-- Now return the InventoryID of the newly inserted record
SELECT SCOPE_IDENTITY()


در زمان برگردان داده scalar با استفاده از یک عبارت SELECT ،‌ می توان با استفاده از روشی که یک resultset بازیابی می گردد ،‌داده های مورد نظر را بازیابی نمود . در چنین مواردی می توان از یک DataSet , DataTable و یا یک DataReader استفاده نمود ( نتایج برگردانده شده صرفا" شامل یک سطر و یک فیلد می باشد).
کد زیر با فراخوانی store_GetAverageInventoryPrice ، مقدار داده scalar را برمی گرداند :

Dim myConnection as New SqlConnection(connection string)
Dim myCommand as New SqlCommand("store_GetAverageInventoryPrice", myConnection)
myCommand.CommandType = CommandType.StoredProcedure

Dim reader as SqlDataReader = myCommand.ExecuteReader()

'Read in the first record and grab the first column
Dim avgPrice as Decimal
If reader.Read() Then
avgPrice = Convert.ToDouble(reader("AveragePrice"))
End If


در مقابل استفاده از متد ExecuteReader می توان از متد ExecuteScalar استفاده نمود . متد ExecuteScalar یک نمونه شی را برمی گرداند . با استفاده از متد فوق کد نوشته شده در مثال قبل به صورت زیر خواهد بود :

Dim myConnection as New SqlConnection(connection string)
Dim myCommand as New SqlCommand("store_GetAverageInventoryPrice", myConnection)
myCommand.CommandType = CommandType.StoredProcedure

Dim avgPriceObject as Decimal = Convert.ToDecimal(myCommand.ExecuteScalar())


در کد فوق می بایست بررسی لازم در مواردی خاصی که result مقدار NULL را می گرداند ، انجام شود .

استفاده از پارامترهای خروجی
یکی دیگر از روش های برگرداندن داده scalar از یک Stored procedure ( به جزء یک resultSet استاندارد ) ،‌ استفاده از یک و یا چندین پارامتر خروجی است . پارامتر خروجی ، پارامتری است که به Stored procedure ارسال و مقدار آن در Stored procedure مقداردهی می گردد . پارامتر فوق در ادامه توسط برنامه ای که Stored procedure را صدا می زند ،‌ خوانده شده و از آن استفاده می گردد .
برای استفاده از یک پارامتر خروجی ، می بایست نوع و ماموریت پارامتر مورد نظر را با استفاده از کلیدواژه OUTPUT مشخص نمود . کد زیر یک Stored procedure را نشان می دهد که کالاهای موجود در انبار با استفاده از یک عبارت SELECT برگردانده شده و در ادامه با استفاده از یک پارامتر خروجی ، قیمت میانگین کالاهای موجود در انبار محاسبه و برگردانده می شود .

CREATE PROCEDURE store_GetInventoryWithAveragePrice
(
@AveragePrice money OUTPUT
)
AS

SET @AveragePrice = (SELECT AVG(Price) FROM store_Inventory)

SELECT InventoryID, ProductName, Price, UnitsOnStock
FROM store_Inventory


برای دستیابی به مقدار یک پارامتر خروجی از طریق یک برنامه ASP.NET ، می بایست یک شی پارامتر را که خصلت Direction آن مقدار OutPut را دارد تعریف نمود . پس از فراخوانی Stored procedure ، مقدار پارامتر خروجی با استفاده از خصلت Value قابل دسترس خواهد بود :

Dim myConnection as New SqlConnection(connection string)
Dim myCommand as New SqlCommand("store_GetInventoryWithAveragePrice", myConnection)
myCommand.CommandType = CommandType.StoredProcedure

'Create a SqlParameter object to hold the output parameter value
Dim avgPriceParam as New SqlParameter("@AveragePrice", SqlDbType.Money)

'IMPORTANT - must set Direction as Output
avgPriceParam.Direction = ParameterDirection.Output

'Finally, add the parameter to the Command's Parameters collection
myCommand.Parameters.Add(avgPriceParam)

'Call the sproc...
Dim reader as SqlDataReader = myCommand.ExecuteReader()

'Now you can grab the output parameter's value...
Dim avgPrice as Decimal = Convert.ToDecimal(avgPriceParam.Value)


در کد فوق می بایست بررسی لازم در مواردی خاصی که result مقدار NULL را می گرداند ، انجام شود .
در زمان استفاده از Stored procedure صرفا" محدود به استفاده از یک پارامتر خروجی نخواهیم بود و می توان در چنین مواردی از چندین پارامتر ورودی و یا خروجی استفاده نمود .

استفاده از یک مقدار برگشتی
روش نهائی به منظور برگرداندن داده scalar از یک Stored procedure ، استفاده از مقادیر برگشتی است . پس از اتمام اجرای یک Stored procedure ، همواره یک مقدار برگردانده می شود که به صورت پیش فرض صفر است . در چنین مواردی می توان از عبارت RETURN برای برگرداندن یک مقدار عددی صحیح استفاده نمود . کد زیر ID رکورد جدید اضافه شده را به عنوان یک مقدار عددی برمی گرداند :

CREATE PROCEDURE store_AddNewInventoryItem
(
@ProductName nvarchar(50),
@Price money
) AS

-- INSERT the new record
INSERT INTO store_Inventory(ProductName, Price)
VALUES(@ProductName, @Price)

-- Now return the InventoryID of the newly inserted record
RETURN SCOPE_IDENTITY()

در کد فوق SCOPE_IDENTITY توسط RETURN برگردانده شده است . این در حالی است که در مثال قبل از یک عبارت select استفاده شده بود.
برای بازیابی مقدار برگردانده شده از یک Stored procedure ، از روش های مشابه پارامترهای خروجی استفاده می گردد . تنها تفاوت موجود در این رابطه ،‌استفاده از مقدار Direction مربوط به ReturnValue است:

Dim myConnection as New SqlConnection(connection string)
Dim myCommand as New SqlCommand("store_GetInventoryWithAveragePrice", myConnection)
myCommand.CommandType = CommandType.StoredProcedure

'Create a SqlParameter object to hold the output parameter value
Dim retValParam as New SqlParameter("@RETURN_VALUE", SqlDbType.Int)

'IMPORTANT - must set Direction as ReturnValue
retValParam.Direction = ParameterDirection.ReturnValue

'Finally, add the parameter to the Command's Parameters collection
myCommand.Parameters.Add(retValParam)

'Call the sproc...
Dim reader as SqlDataReader = myCommand.ExecuteReader()

'Now you can grab the output parameter's value...
Dim retValParam as Integer = Convert.ToInt32(retValParam.Value)

جمع بندی
در این مقاله با سه روش متفاوت به منظور برگرداندن داده scalar از طریق یک Stored procedure آشنا شدیم: عبارت SELECT ، پارامترهای خروجی و مقدار برگردانده شده .
در مواردی که یک داده scalar با استفاده از یک عبارت SELECT برگردانده می شود ،‌ نتایج مورد نطر با استفاده از متد ExecuteScalar در دسترس و قابل استفاده خواهند بود . برای پارامترهای خروجی و مقادیر برگردانده شده ،‌ می بایست یک شی پارامتر با مقدار مناسب خصلت Direction ایجاد و پس از فراخوانی Stored procedure به منظور دستیابی به نتایج برگردانده شده از مقدار خصلت Value استفاده گردد .

بازیابی N رکورد جدید با استفاده از یک query

بازیابی N رکورد جدید با استفاده از یک query

در زمان پیاده سازی برنامه های وب ، ممکن است به مواردی برخورد نمائیم که می بایست به تعداد مشخصی از جدیدترین رکوردهای درج شده در یک بانک اطلاعاتی دستیابی و آنان را بر روی یک صفحه وب نمایش دهیم. مثلا" یک وب سایت خبری ممکن است دارای یک جدول بانک اطلاعاتی باشد ( مثلا" NewsStoriesTable ) که برای هر خبری که تعر یف می گردد یک رکورد را در جدول مربوطه اضافه می نماید . در صورتی که بخواهیم صرفا" ده خبر جدید موجود در بانک اطلاعاتی را بر روی صفحه اصلی سایت منتشر نمائیم ، از چه روش و یا روش هائی می توان استفاده نمود؟ احتمالا" پیشنهاد می نمائید که از عبارت و یا دستور SELECT به صورت زیر استفاده گردد :

SELECT * FROM NewsStoriesTable

روش فوق ، تمامی رکوردهای موجود در جدول NewsStoriesTable را برمی گرداند ( نه صرفا" ده رکورد جدید موجود در بانک ) . در صورتی که بخواهیم صرفا" تعداد مشخصی از رکوردها را استفاده نمائیم ، می بایست با استفاده از منطق برنامه نویسی عملیات فیلترینگ را انجام تا صرفا" N رکورد مورد نظر با عبور از فیلتر ایجاد شده شرایط موجود در برنامه را تامین نمایند.
آیا روش فوق گزینه ای منطقی است ؟ پاسخ به سوال فوق منفی است و برای بازیابی رکوردهای موجود در بانک اطلاعاتی از مکانیزم های قدرتمند و مناسبی استفاده نشده است ، چراکه در ابتدا می بایست تمامی رکوردهای موجود در بانک پس از اجرای query مورد نظر برگردانده شده و در ادامه بر روی صفحه وب منتقل و با توجه به کد نوشته شده ، تعداد مشخصی از آنان را نمایش و یا سایر عملیات دلخواه را بر روی آنان انجام داد . بدیهی است به موازات افزایش تعداد رکوردهای موجود در بانک ، کارآئی روش فوق کاهش خواهد یافت .
از دیگر روش های موجود،استفاده از کلید واژه های TOP و ROWCOUNT در ارتباط با سرویس دهنده SQL است . با استفاده از کلید واژه های فوق می توان تعداد رکورد برگردانده شده توسط اجرای یک query را محدود به تعداد مشخصی نمود . بدین ترتیب ، حجم اطلاعات بازیابی شده در اثر اجرای یک query کاهش یافته و امکان مشاهده آنان با صرف زمان مناسب فراهم می گردد .
در ادامه با تمرکز برروی هر یک از کلید واژه های TOP و ROWCOUNT با نحوه استفاده از آنان بیشتر آشنا می شویم .

اعمال محدودیت در بازیابی رکوردها با استفاده از TOP
کلید واژه TOP در SQL SERVER 7.0 معرفی و هدف آن ارائه روشی به منظور اعمال محدودیت در بازیابی نتایج حاصل از اجرای یک SELECT query می باشد . با استفاده از TOP می توان N رکورد جدید موجود در بانک را و یا X درصد از رکوردهای جدید را بازیابی نمود . گرامر استفاده از TOP به صورت زیر است :
SELECT TOP N select list
FROM TableName

'Example :

SELECT TOP 5 *
FROM authors

الگوی دوم

SELECT TOP X PERCENT select list
FROM TableName

'Example :

SELECT TOP 25 PERCENT au_lname, au_fname
FROM authors
WHERE zip = '92101'

در کد فوق ، N و X می بایست دارای مقادیر صحیح مثبت باشند و در صورتی که از الگوی دوم استفاده می گردد ، X می بایست دارای مقداری بین صفر تا یکصد باشد .
استفاده از TOP ، باعث دستیابی به N رکورد جدید و یا X درصد از رکوردهای جدید موجود در بانک اطلاعاتی می گردد . معمولا" چنین درخواست هائی به همراه ORDER BY استفاده می گردد . مثلا" برای برگرداندن ده رکورد و یا خبر جدید ، می بایست از ORDER BY نبز به منظور مرتب سازی آنان بر اساس تاریخ درج در بانک اطلاعاتی ( PublicationDate ) استفاده گردد . کد زیر نحوه انجام ابن کار را نشان می دهد :

SELECT TOP 10 NewsURL, ArticleTitle, ArticleAuthor FROM NewsStoriesTable
ORDER BY PublicationDate DESC

اعمال محدودیت در بازیابی رکوردها با استفاده از ROWCOUNT
قبل از SQL SERVER 7.0 ، تنها روش موجود برای اعمال محدودیت در بازیابی رکوردهائی که در اثر اجرای یک query برگردانده می شوند ، استفاده از متغیر ROWCOUNT بود که در ابتدا و قبل از اجرای هر گونه query می بایست به آن یک مقدار عددی بزرگتر از صفر نسبت داده شود :

SET ROWCOUNT N

پس از مقداردهی متغیر ROWCOUNT ، تمامی عبارات زیرمجموعه SQL موجود در حوزه ، صرفا" قادر به پردازش N رکورد خواهند بود . اکثر نسخه های جدید سرویس دهنده SQL همچنان امکان استفاده از ROWCOUNT را حمایت می نمایند . بخاطر داشته باشید که مقدار نسبت داده شده به متغیر ROWCOUNT صرفا" در ارتباط با دستور SELECT اعمال نخواهد شد و دستورات و یا عبارات دیگری نظیر INSERT , UPDATE و DELETE را نیز شامل می شود . کد زیر نحوه استفاده از ROWCOUNT به منظور بازیابی ده رکورد جدید موجود در جدول NewsStoriesTable را نشان می دهد :

SET ROWCOUNT 10
SELECT NewsURL, ArticleTitle, ArticleAuthor
FROM NewsStoriesTable
ORDER BY PublicationDate DESC

موارد استفاده از TOP و ROWCOUNT
در صورتی که از SQL SERVER 6.5 و نسخه های قبل از آن استفاده می گردد ، مجبور به استفاده از ROWCOUNT خواهیم بود چراکه در نسخه های فوق TOP معرفی نشده و امکان استفاده از آن وجود نخواهد داشت . به منظور استفاده از TOP می بایست حداقل از نسخه SQL Server 7.0 استفاده گردد .
در صورتی که از یک عبارت SELECT استفاده می گردد و دقیقا" مشخص است که چه تعداد رکورد را می بایست بازیابی نمود ، پیشنهاد می گردد که از TOP استفاده گردد . TOP به منظور کار با عبارت SELECT طراحی شده است و دارای اثرات جانبی ROWCOUNT نمی باشد ( استفاده از آن در ارتباط با عباراتی به غیر از SELECT و تاثیر بر روی triggers ) .
برای عبارات ساده SELECT دلیل خاصی برای استفاده از ROWCOUNT وجود ندارد ولی اگر قصد فراخوانی یک Stored procedure را دارید که یک SELECT را انجام می دهد و عبارات دیگری را نیز پردازش می نماید ، در زمان استفاده از ROWCOUNT می بایست این اطمینان حاصل گردد که مقدار نسبت داده شده به ROWCOUNT صرفا" در ارتباط با query مورد نطر بکارگرفته می شود .
در این رابطه یک حالت خاص وجود دارد که ترجیح داده می شود از ROWCOUNT در یک SELECT query در مقابل TOP استفاده گردد : زمانی که قصد دارید به پیاده کننده صفحه وب اجازه دهید که تعداد نتایج برگردانده شده اجرای یک query را مشخص نمایند . مثلا" فرض کنید دارای یک Stored procedure با نام getRecentArticles باشیم که یک پارامتر عددی صحیح را با نام ResultCount @ از ورودی می گیرد . در چنین مواردی Stored procedure می بایست صرفا" به تعداد ResultCount @ رکورد جدید موجود در بانک را برگرداند( نه این که همواره ده رکورد را برگرداند ) . بدین ترتیب به پیاده کندگان صفحات وب اجازه داده می شود که مشخص نمایند که به چه تعداد رکورد جدید موجود در بانک می توانند دستیابی داشته باشند . کد زیر نحوه انجام این کار را نشان می دهد :

CREATE PROCEDURE getRecentArticles
(
@ResultCount int
)
AS

نوشتن query مورد نظر برای برگرداندن ResultCount @ رکورد

در صورتی که از یک query پویا در stored procedure استفاده گردد ،‌ می توان از TOP نیز استفاده نمود . روش استفاده از TOP در کد زیر صحیح نمی باشد و در مقابل ، می بایست به صورت پویا یک query را ایجاد و در ادامه با استفاده از EXEC و یا sp_executesql آن را اجراء نمود.

CREATE PROCEDURE getRecentArticles
(
@ResultCount int
)
AS

SELECT TOP @ResultCount NewsURL, ArticleTitle, ArticleAuthor
FROM NewsStoriesTable
ORDER BY PublicationDate DESC

کد زیر نحوه استفاده از ROWCOUNT در یک Stored Procedure و متناسب با پارامتر ورودی را نشان می دهد :

CREATE PROCEDURE getRecentArticles
(
@ResultCount int
)
AS

SET ROWCOUNT @ResultCount

SELECT NewsURL, ArticleTitle, ArticleAuthor
FROM NewsStoriesTable
ORDER BY PublicationDate DESC



در صورتی که قصد اعمال محدودیت در بازیابی رکوردهای حاصل از اجرای دستورات INSERT ,UPDATE و یا DELETE را داشته باشید ، می بایست از ROWCOUNT استفاده گردد ،‌ چراکه TOP صرفا" در ارتباط با عبارت SELECT بکار گرفته می شود.

جمع بندی
در این مقاله ، با طرح این پرسش که نحوه بازیابی n رکورد جدید در یک بانک اطلاعاتی با استفاده از یک query به چه صورت است ، دو کلید واژه TOP و ROWCOUNT معرفی گردیدند . پس از آشنائی با گرامر هر یک از کلید واژه های فوق ،‌ آنان را با یکدیگر مقایسه و در نهایت با جایگاه استفاده هر یک از آنان آشنا شدیم .

DataSet و یا DataReader ؟

دو شی ارائه شده در ADO.NET به منظور دستیابی به داده می باشند . اشیاء فوق امکانات متعددی برای دستیابی به داده در برنامه های دات نت را در اختیار پیاده کنندگان قرار می دهند . Scott Mitchell اخیرا" در مقاله ای جامع که بر روی سایت http://www.4guysfromrolla.com منشتر شده است به بررسی دو شی فوق پرداخته و آنان را از زوایای متفاوتی مقایسه و در نهایت به این نتیجه رسیده است که استفاده از DataReader در برنامه های وب دارای مزایای بمراتب بیشتری نسبت به DataSet است . برای آشنائی با دلایل وی برای رسیدن به نتیجه فوق ، خلاصه ای از مقاله وی را در ادامه با هم مطالعه می کنیم .

مبانی و اصول اولیه DataReader
DataReader و DataSet دارای وظایف متفاوتی بوده و با اهداف مختلفی طراحی و پیاده سازی شده اند :

*

DataSet : یک بانک اطلاعاتی کوچک در حافظه
*

DataReader : ترابری داده بین لایه بانک اطلاعاتی و یک برنامه دات نت

در ADO.NET یک provider شامل تعدادی منبع است و کلاس های خاص مرتبط با هر provider به منظور کار با ارائه دهندگان مربوطه ارائه شده است . مثلا" کلاس های SqlConnection, SqlCommand, SqlDataAdapter و SqlDataReader جهت کار با SqlClient provider و کلاس های OleDbConnection, OleDbCommand, OleDbDataAdapterو OleDbDataReader جهت کار با OleDb provider ارائه شده اند.اشیائی که شامل یک پیشوند با نام یک provider می باشند ( نظیر Sql,OleDb,Oracle و ... ) ، اشیاء مختص و وابسته به Provider بوده و به منظور کار با یک Provider خاص طراحی و پیاده سازی شده اند.
DataReader یکی از اشیاء فوق است ( SqlDataReader, OleDbDataReader ) .به منظور استفاده از شی فوق می بایست در ابتدا یک connection به منبع داده ایجاد و query مورد نظر جهت اجراء مشخص گردد . در ادامه DataReader ایجاد و به عنوان یک پل ارتباطی بین برنامه دات نت و منبع ذخیره سازی داده ایفای وظیفه می نماید . مثلا" می توان از کد زیر در این رابطه استفاده نمود :

' Create command
Dim myCommand as New SqlCommand(myConnection, SQL query or stored procedure)

' Create a DataReader to ferry information back from the database
Dim myReader as SqlDataReader
myReader = myCommand.ExecuteReader()

'Iterate through the results
While myReader.Read()
'... Work with the current record ...
End While

' Close the connection (will automatically close the reader)
myConnection.Close()

DataReader در هر لحظه یک رکورد را از منبع ذخیره سازی داده load می نماید . هر مرتبه که متد Read شی DataReader فراخوانده گردد ، DataReader رکورد جاری را کنارگذاشته و با مراجعه به بانک اطلاعاتی ، رکورد بعدی را بازیابی می نماید .در صورتی که یک سطر از بانک اطلاعاتی load شده باشد ، متد Read مقدار True و اگر رکوردی برگردانده نشود ، مقدار False برگردانده خواهد شد .
DataReader ، یک شی داده Connected بوده و نیازمند وجود یک اتصال فعال با بانک اطلاعاتی است . بخاطر داشته باشید که DataReader صرفا" مکاینزم لازم برای ترابری داده بین برنامه و بانک اطلاعاتی را ارائه نموده و پس از قطع connection ، امکان برگرداندن اطلاعات به بانک اطلاعاتی وجود نخواهد داشت . DataReader دارای ویژگی فقط خواندنی و فقط به سمت جلو می باشد . این بدان معنی است که اطلاعات بازیابی شده از بانک اطلاعاتی را نمی توان با استفاده از DataReader تغییر و یا اقدام به بازیابی رکوردها به صورت تصادفی نمود . DataReader محدود به دستیابی رکوردها به صورت ترتیبی ( از اولین رکورد به سمت آخرین رکورد ) است .

مبانی و اصول اولیه DataSet
DataSet یک شی بمراتب پیچیده تر و با ویژگی های بیشتر در مقایسه با DataReader است . در حالی که DataReader به سادگی عملیات برگرداندن داده از یک منبع داده را برعهده دارد ، DataSet را می توان به منزله یک بانک اطلاعاتی مقیم در حافظه تصور نمود . DataSet همانند یک بانک اطلاعاتی از مجموعه ای جدول تشکیل شده است . یک DataSet از مجموعه ای شی DataTable تشکیل می گردد . همانگونه که یک بانک اطلاعاتی می تواند دارای ارتباطاتی بین جداول مربوطه به خود باشد ( به همراه محدودیت های متفاوتی در ارتباط با فیلدهای تعریف شده در هر یک از جداول ) ، یک DataSet نیز می تواند دارای ارتباطات مشخص بین اشیاء DataTable مربوط به خود و محدودیت های لازم برروی فیلدهای DataTable باشد .
برخلاف DataReader ، یک DataSet یک شی داده مستقل از Provider است و در این رابطه اشیائی نظیر SqlDataSet و یا OleDbDataSet وجود ندارد و این مسئولیت شی DataAdapter مربوط به Provider است که داده مختص provider را درون یک DataSet مستقل ( نه یک provider خاص ) ترجمه نماید . کد زیر نحوه استفاده از DataSet را نشان می دهد :

' Establish Connection
Dim myConnection as New SqlConnection(connection string)
myConnection.Open()

' Create command
Dim myCommand as New SqlCommand(SQL query or stored procedure, myConnection)

' Create the DataAdapter
Dim myDataAdapter as New SqlDataAdapter(myCommand)

' Create the DataSet
Dim myDataSet as New DataSet

' Fill the DataSet
myDataAdapter.Fill(myDataSet)

' Close the connection
myConnection.Close()

'... Work with the contents of the DataSet ...

همانگونه که در کد فوق مشاهده می گردد ، متد Fill مربوط به شی DataAdapter مسئولیت پر نمودن DataSet را با توجه به query مورد نظر برعهده دارد . در پس پرده ، از یک DataReader به منظور خواندن نتایج اجرای query و پر نمودن DataSet استفاده می گردد. DataSet یک شی داده disconnected است. این بدان معنی است که پس از استقرار داده در DataSet ، می توان connection را غیرفعال ( close ) و همچنان بررسی و پردازش لازم بر روی داده های موجود در DataSet را انجام داد .
با توجه به این که DataSet یک مجموعه از داده های غیرمتصل جداگانه را ارائه می نماید ، امکان ویرایش و دستیابی تصادفی به اطلاعات موجود در آن وجود خواهد داشت . دو ویژگی فوق در DataReader وجود ندارند . علاوه بر موارد فوق ، DataSet دارای پتانسیل های قدرتمندی به منظور کار با اسناد XML است . مثلا" می توان با استفاده از متد WriteXml اطلاعات موجود در یک DataSet را درون یک فایل XML مستقر و یا می توان اطلاعات موجود در یک فایل XML را با استفاده از متد ReadXml شی DataSet خواند و در یک DataSet مستقر نمود .

DataReader و یا DataSet
صرفنظر از این که از DataSet و یا DataReader به منظور بازیابی داده های موجود در بانک اطلاعاتی استفاده می گردد ، می توان به منظور نمایش داده های مورد نظر از کنترل های DataList, DataGrid و یا Repeater با استفاده از یک کد مشابه استفاده نمود . بدین منظور لازم است که خصلت DataSource هر یک از کنترل های فوق به DataReader و یا DataSet نسبت داده شده و در ادامه متد DataBind مربوطه ( کنترل های DataList, DataGrid و یا Repeater ) فراخوانده گردد .
کار با داده ها در ASP.NET بسیار ساده است بگونه ای که معمولا" پیاده کنندگان برنامه های وب ASP.NET هرگز این موضوع را به ذهن خود خطور نخواهند داد که بهترین شی که می توان از آن به منظور دستیابی به داده استفاده نمود ، چیست ؟ آنان بر این عقیده هستند که همه چیز معادل هم بوده و خیلی مهم نخواهد بود که از کدام شی در این رابطه استفاده می گردد .
آیا واقعا" همه چیز یکسان و معادل می باشد ؟ به وضوح مشخص است که بین ویژگی ها و پتانسیل های ارائه شده توسط هر یک از اشیاء DataReader و DataSet تفاوت های عمده ای وجود دارد . DataSet ویژگی های بمراتب بیشتری را در اختیار پیاده کنندگان قرار می دهد و همین موضوع باعث شده است که کارآئی آن برای خواندن داده نسبت به DataReader کمتر گردد .
بر اساس مطالعه انجام شده در رابطه با سرعت بازیابی داده در ADO.NET ، سرعت و کارآئی DataReader سی مرتبه بیش از DataSet می باشد . در بررسی انجام شده بر روی یکهزار رکورد بازیابی شده ، مشخص شده است که DataSet سی مرتبه کندتر از DataReader است ( 89 / 8 ثانیه در مقابل 29 /0 ثانیه ) .

موارد استفاده مفید از DataSet
صرفنظر از محدودیت های DataSet از بعد کارآئی ، در مواردی لازم است که از این شی استفاده گردد و گرنه شی فوق به عنوان یکی از عناصر کلیدی در فریمورک دات نت محسوب نمی گردید . استفاده از DataSet در یکی از دو مورد زیر می تواند مفید واقع شود :

*

برنامه های Desktop : فرض کنید دارای یک برنامه ورود اطلاعات desktop-based باشیم . یک کاربر برنامه را اجراء ، داده هائی خاص را از برخی بانک های اطلاعاتی load و پس از اعمال تغییرات لازم آنان را در بانک اطلاعاتی ذخیره می نماید . وضعیت فوق یک حالت ایده آل برای DataSet است و امکان خواندن داده ها از درون یک DataSet مستقر در حافظه کامپیوتر سرویس گیرنده ، وجود خواهد داشت . بدین ترتیب کاربران می توانند با داده ها بدون نیاز به ارتباط مستمر با بانک اطلاعاتی کار کنند . پس از اتمام عملیات ویرایش داده ها ، به منظور اعمال تغییرات لازم می توان از یک Batch update استفاده نمود . از آنجائیکه DataSet یک منبع ذخیره سازی داده disconnected است ، امکان دستیابی offline به داده ها وجود خواهد داشت .
چنین وضعیتی ممکن است در یک برنامه وب نیز محقق گردد و لازم باشد که کاربران با برنامه وب همانند آنچه اشاره گردید ، ارتباط برقرار نمایند . آنان یک صفحه وب را مشاهده نموده و پس از اعمال تغییرات لازم ، صرفا" با فعال نمودن یک دکمه Update تغییرات را در بانک اطلاعاتی ثبت نمایند .بانک اطلاعاتی مورد نظر بهنگام نمی گردد تا زمانی که دکمه Update فعال گردد . در چنین مواردی می توان از یک Dataset مبتنی بر Session استفاده نمود.
*

ارسال و یا دریافت از راه دور اطلاعات از بانک اطلاعاتی به منظور برقراری ارتباط بین پلت فورم های متفاوت : با توجه به این موضوع که یک DataSet می تواند به سادگی درون یک فایل XML قرار داده شود و یا از آن خوانده شوند ، به عنوان اولین کاندید برای ارسال اطلاعات بین پلت فورم های متفاوت مطرح می باشد .مثلا" در صورتی که قصد برگرداندن داده بانک اطلاعاتی را از طریق یک سرویس وب داشته باشید ، یکی از روش های موجود در این زمینه این است که داده های بانک اطلاعاتی درون یک DataSet قرار داده شوند و در ادامه با استفاده از متد سرویس وب، DataSet برگردانده شود . در چنین حالتی DataSet به صورت اتوماتیک درون یک فایل XML قرار داده شده و ارسال می گردد .

علل استفاده از DataSet و علل عدم استفاده از DataSet
در برنامه های وب به مواردی برخورد می کنیم که شاید استفاده از DataSet تنها گزینه موجود در این رابطه باشد . مثلا" فرض کنید قصد داریم برخی اطلاعات موجود در بانک اطلاعاتی را Cache نموده تا از آنان در صفحات متعددی بر روی یک سایت استفاده گردد . این نوع داده ها ممکن است وابسته به نوع کاربر بوده و در Session ذخیره شده باشند و یا ممکن است توسط تمامی کاربران استفاده گردند . در چنین مواردی می بایست اطلاعات را در Data Cache ذخیره نمود .
DataReader با توجه به این که یک شی disconnected است ، نمی تواند برای Cache کردن داده ها مورد استفاده قرار گیرد و در زمان استفاده از آن می بایست اتصالات به بانک اطلاعاتی فعال و بسیار کوتاه باشند ( Short-Live ) . با توجه به موارد فوق در صورتی که قصد دارید داده های بانک های اطلاعاتی را Cache نمائید ، استفاده از DataSet می تواند یکی از گزینه های موجود در این رابطه باشد .ولی آیا این تنها گزینه موجود است ؟ در چنین مواردی می توان یک کلاس را ایجاد که دارای خصلت هائی متناظر و مرتبط با فیلدهای بانک اطلاعاتی است که قصد ذخیره آنان در یک DataSet را دارید . در زمان Cache نمودن داده می توان از یک DataReader به منظور خواندن query از بانک اطلاعاتی ، بازیابی و حرکت بین رکوردهای برگردانده شده استفاده نمود . در این رابطه لازم است برای هر رکورد یک نمونه کلاس سفارشی شده ایجاد ، خصلت های آن را متناسب با مقادیر موجود در query تنظیم و کلاس سفارشی را به یک ArrayList اضافه نمود . در ادامه می توان اشیاء سفارشی را Cache نمود . روش فوق علاوه بر افزایش کارآئی ، قابلیت پشتیبانی را نیز بهتر خواهد کرد . همچنین می توان این مجموعه از کلاس های سفارشی شده را به یک کنترل وب داده ASP.NET ( نظیر DataList, DataGrid و یا Repeater ) نیز نسبت داد (مشابه استفاده از یک DataSet و یا DataReader ) .
یکی دیگر از مواردی که می تواند دلایل استفاده از یک DataSet را در برنامه های وب توجیه نماید ، زمانی است که قصد دستیابی تصادفی به داده هائی خاص در بین تعدادی رکورد را داشته باشیم . چراکه رکوردهای فوق ممکن است بدفعات استفاده گردند . مثلا" فرض کنید قصد استفاده از یک master/detail DataGrid را داریم که در آن یک ستون از DataGrid شامل رکورد مادر و سایر ستون ها شامل DataGrid دیگر ( مرتبط با سطر فرزند) باشد . در چنین مواردی استفاده از یک DataSet به منظور جمع آوری تمامی رکوردهای فرزند از بانک اطلاعاتی در مقابل این روش که برای هر سطر DataGrid یک query را استفاده نمود ، ترجیح داده می شود . کارآئی روش فوق به تعداد سطرهای موجود در جدول مادر بستگی خواهد داشت . از آنجائیکه یک DataSet سی مرتبه کندتر از یک DataReader است ، اگر بیش از سی رکورد در جدول مادر وجود دارد که قصد نمایش آنان را داریم ، استفاده از یک DataSet می تواند گزینه ای معقول تر در این زمینه باشد تا این که برای هر رکورد مادر یک query را اجراء نمود .

ایجاد یک وب سایت توسط ویژوال استودیو 2005 ( بخش دوم )

با اولین مرحله ایجاد یک وب سایت توسط ویژوال استودیو 2005 آشنا شدیم . در این بخش به بررسی مراحل دوم ( افزودن کنترل به صفحه ) و سوم ( نوشتن روتین های پاسخگو در زمان بروز یک رویداد ) ، خواهیم پرداخت .

مرحله دوم : افزودن کنترل های سرویس دهنده به صفحه
صفحات وب پویا ، در مقابل خواسته کاربران پاسخگو بوده و متناسب با درخواست آنان اطلاعات را تولید و عرضه می نمایند . این موضوع جایگاه مهم فرم های وب را به خوبی مشخص می نماید . با استفاده از فرم های وب ، کاربران درخواست خود را ارسال و پاسخ آن را از سرویس دهنده دریافت می نمایند . در فرم های وب از چندین نوع کنترل سرویس دهنده به منظور انجام پردازش های سمت سرویس دهنده استفاده می گردد :

*

کنترل های Input و Validation در ارتباط با کاربر بوده و داده مورد نیاز پردازش ها را تامین می نمایند.
*

کنترل های Script Activation ،‌ مسئولیت فراخوانی برنامه های فرعی و توابع را به منظور انجام پردازش های مورد نیاز برعهده دارند.
*

کنترل های خروجی و نمایش اطلاعات ، نواحی مقصد بر روی صفحات را مشخص نموده تا ماحصل اجرای اسکریپت ها در آن نواحی نمایش داده شود .
*

کنترل های منبع داده در ارتباط با منابع داده خارجی بوده و اطلاعات مورد نیاز برای پردازش و یا نمایش را ارائه می نمایند .
*

کنترل های navigation ، تسهیلات لازم به منظور حرکت در یک سایت را در اختیار کاربر قرار می دهند .

در ASP.NET فرم ها و کنترل های موجود بر روی آنان به منزله اشیاء سرویس دهنده بوده ( نه عناصر HTML ) و امکان دستیابی به آنان توسط اسکریپت های سمت سرویس دهنده وجود دارد .
پس از مقدمه فوق که هدف از بیان آن آشنائی با جایگاه فرم ها و نقش کنترل های سرویس دهنده است ، در ادامه با نحوه اضافه کردن کنترل های سرویس دهنده بر روی یک صفحه آشنا می شویم .
در این مرحله سه کنترل سرویس دهنده ( button ,Label,TextBox ) را به صفحه اضافه می نمائیم و تنظمیات لازم را برای هر یک از آنان انجام خواهیم داد .

*

کنترل TextBox : کنترل فوق از جمله کنترل های سرویس دهنده ورودی است که با استفاده از آنان می توان بخش رابط کاربر یک فرم وب را پیاده سازی و اطلاعاتی را از کاربر دریافت نمود . RadioButton , RadioButtonList , CheckBox ,CheckBoxList , DropDownList و ListBox از دیگر کنترل های سرویس دهنده ورودی می باشند .
*

کنترل label : کنترل فوق از جمله کنترل های سرویس دهنده خروجی است که با استفاده از آن یک ناحیه بر روی صفحات وب ایجاد و می توان خروجی مورد نظر را در آن ناحیه درج نمود . Panel , Table و Image از دیگر کنترل های سرویس دهنده خروجی می باشند .
*

کنترل Button : کنترل فوق از جمله کنترل های سرویس دهنده ای است که با استفاده از آن می توان یک اسکریپت را فعال نمود . LinkButton ,ImageButton و ImageMap نمونه هائی دیگر در این زمینه می باشند .

افزودن کنترل به صفحه

*

سوئیچ به Design View
*

فشردن کلید SHIFT+ENTER برای ایجاد فضای خالی ( در صورت لزوم چندین مرتبه )
*

از طریق Toolbox و گروه استاندارد ، سه کنترل اشاره شده را انتخاب و آنان را بر روی صفحه قرار می دهیم.
( button ,Labels,TextBox )

استفاده از toolbox و افزودن کنترل به فرم وب

*

در قسمت بالای کنترل TextBox قرار گرفته و یک متن دلخواه را تایپ نمائید ( مثلا" "لطفا" نام خود را وارد نمائید: " ) . متن فوق به عنوان caption کنترل TextBox در نظر گرفته می شود .

افزودن کنترل سرویس دهنده به یک فرم وب

تنظیم خصلت های کنترل
VWD ، روش های متفاوتی‌ را برای تنظیم خصلت کنترل های موجود بر روی یک صفحه وب در اختیار پیاده کنندگان صفحات وب قرار می دهد . در ادامه با نحوه تنظیم خصلت کنترل ها در حالت Design View و Source View آشنا می شویم .

*

کنترل Button را انتخاب کرده و در ادامه و از طریق پنجره Properties ، خصلت Text آن را "نمایش نام " در نظر می گیریم .

تنظیم خصلت های کنترل button

*

به Source View سوئیچ نمائید . در این mode ، تگ های Html صفحه به همراه عناصری که VWD برای کنترل های سرویس دهنده ایجاد کرده است ، نمایش داده می شوند . کنترل ها از گرامری شبیه Html استفاده می نمایند با این تفاوت که آنان دارای یک پیشوند asp: و خصلت " runat="server ، می باشند. تمامی کنترل ها درون یک تگ
قرار داده می شوند که شامل خصلت " runat="server است . خصلت فوق و پیشوند asp: هر یک از کنترل ها این امکان را فراهم می نماید که بتوان از طریق اسکریپت های سمت سرویس دهنده به آنان دستیابی و پردازش های مورد نیاز را انجام داد .
*

مکان نما را در محلی درون تگ قرار داده و کلید spacebar را فعال نمائید . یک لیست Drop-down نمایش داده شده و مجموعه ای از خصلت هائی را که می توان برای‌ کنترل Label تنظیم نمود ، نشان داده می شود. به ویژگی فوق IntelliSense گفته شده و باعث می شود بتوان زمانی که در Source View می باشیم با گرامر کنترل های سرویس دهنده ، تگ های Html و سایر آیتم های موجود بر روی صفحه به سرعت دستیابی داشت . خصلت ForeColor را انتخاب نموده و یک علامت "=" را تایپ نموده بلافاصله IntelliSense لیستی از رنگ ها را نشان می دهد . در هر لحظه می توان با فشاردادن کلیدهای CTRL+J لیست Intellisense Drop-down را مشاهده نمود.

IntelliSense

مرحله سوم : نوشتن روتین های پاسخگو در زمان بروز یک رویداد ( رویداد onclick کنترل button )
در این مرحله کد لازم برای خواندن نام تایپ شده توسط کاربر در کنترل Textbox و نمایش آن در کنترل label نوشته می گردد. برای افزودن یک روتین پاسخگوی پیش فرض ، مراحل زیر را دنبال می نمائیم :

*

سوئیچ به Design View
*

بر روی کنترل Button کلیک می نمائیم ( Double Click ) . در ادامه ، VWD به Source View سوئیچ نموده و یک Skeleton event handler برای رویداد پیش فرض ( click ) کنترل Button را ایجاد می نماید . ( Double Click بر روی یک کنترل در Design view صرفا" یکی از روش های موجود برای ایجاد event handlers است ) .

Skeleton event handler

*

درون handler ، عبارت Label1 را تایپ نمائید . در ادامه VWD ، لیستی از اعضاء قابل استفاده در رابطه با کنترل label را نشان می دهد :

لیستی از اعضاء کنترل label

*

پس از اتمام Click event handler کد زیر را خواهیم داشت :



زمانی که در Sourec View هستیم ، کنترل asp:Button دارای یک خصلت "onClick="Button1_Click است . خصلت فوق ، روتین Button1_Click را به رویداد Click کنترل button نسبت می دهد .

مرحله نهائی : اجرای برنامه
برای اجرای برنامه و مشاهده آن در مرورگر می توان از کلیدهای CTRL+F5 استفاده نمود . در ادامه صفحه مجددا" با استفاده از ASP.NET Development Server اجراء می گردد . پس از درج یک نام دلخواه در Textbox و کلیک برروی دکمه Button ، نام تایپ شده در Label نمایش داده می شود .پس از کلیک بر روی دکمه button ، صفحه برای سرویس دهنده وب ارسال خواهد شد و ASP.NET مجددا" صفحه را ایجاد ، کد موجود در صفحه را اجراء و صفحه جدید را برای مرورگر ارسال می نماید ( یک round trip برای سرویس دهنده) .
در صورت مشاهده source صفحه ارسالی در مرورگر (با استفاده از گزینه View | Source ) ، صرفا" تگ های Html نشان داده شده و کنترل های سرویس دهنده که با asp: شروع می شوند را مشاهده نخواهیم کرد.

یجاد یک وب سایت توسط ویژوال استودیو 2005 (بخش اول)

ایجاد یک وب سایت توسط ویژوال استودیو 2005 (بخش اول)
ویژوال استودیو دات نت نسخه 2005 ، یک محیط پیشرفته به منظور طراحی وب سایت های پویا و یا برنامه های وب را در اختیار پیاده کنندگان قرار می دهد . به همراه ویژوال استودیو دات نت 2005 ، ابزار پیاده سازی برنامه های وب که از آن با نام VWD ( برگرفته از Visual Web Developer ) نیز نام برده می شود ارائه شده است . VWD ، مجموعه ای از ابزارها و برنامه های کمکی به منظور ایجاد وب سایت های مبتنی بر ASP.NET 2.0 را در اختیار پیاده کنندگان قرار می دهد .
در این مقاله قصد داریم با نحوه ایجاد یک وب سایت با استفاده از امکانات ویژوال استودیو دات نت 2005 آشنا شویم . بدین منظور مراحل زیر را دنبال نموده و پس از انجام هر مرحله نتایج را بررسی خواهیم کرد.

* مرحله اول : ایجاد یک وب سایت و صفحه جدید
* مرحله دوم : افزودن کنترل های سرویس دهنده به صفحه
* مرحله سوم : نوشتن روتین های پاسخگو در زمان بروز یک رویداد ( Event handlers )

مرحله اول : ایجاد یک وب سایت و صفحه جدید
برای ایجاد یک وب سایت در محیط ویژوال استودیو از گزینه های زیر می توان با توجه به شرایط موجود استفاده نمود :

*

ایجاد یک وب سایت مبتنی بر سیستم فایل : این نوع سایت ها ، صفحات و سایر فایل ها را در یک فولدر موجود بر روی سیستم محلی ذخیره می نمایند . در چنین مواردی ضرورتی به نصب IIS بر روی کامپیوتر محلی وجود نداشته و می توان از ASP.NET Development Server همراه با ویژوال استودیو دات نت استفاده نمود .
*

ایجاد یک وب سایت محلی با استفاده از امکانات ارائه شده توسط سرویس دهنده وب مایکروسافت ( IIS ) : در این نوع سایت ها که با فرض نصب IIS بر روی سیستم ایجاد خواهند شد ، تمامی فایل ها و صفحات در یک فولدر زیر مجموعه و در مسیر ریشه محل نصب IIS ( معمولا" Inetpubwwwroot ) ذخیره خواهند شد . پس از ایجاد وب سایت ، برای اجرای برنامه از آدرس http://localhost/yourFolderName/YourPage.aspx استفاده می گردد .
*

ایجاد یک وب سایت بر روی یک سرویس دهنده راه دور : این نوع سایت ها بر روی یک سرویس دهنده از راه دور ایجاد خواهند شد و می توان از طریق اینترنت و با استفاده از پروتکل FTP اقدام به ارسال فایل ( و یا دریافت فایل ) به وب سایت مورد نظر نمود .

ایجاد یک وب سایت جدید
در این مقاله ایجاد یک وب سایت را با لحاظ کردن گزینه اول و انجام مراحل زیر دنبال می نمائیم :

*

اجرای ویژوال استودیو دات نت
*

انتخاب گزینه Web site از طریق File |New . در ادامه جعبه محاوره ای New Web Site نمایش داده می شود .
*

در پنجره Visual Studio installed templates ، گزینه ASP.NET Web Site را انتخاب می نمائیم ( در زمان ایجاد یک وب سایت ، از یک تمپلیت استفاده می گردد . هر تمپلیت برنامه وبی را ایجاد می نماید که شامل فایل ها و فولدرهای مختلفی است ) .
*

از طریق فیلد Location ، ( از طریق این فیلد می بایست نوع وب سایت و مکان ذخیره فایل ها و صفحات وب سایت را مشخص نمود ) گزینه File System را انتخاب کرده و در ادامه نام فولدر محل ذخیره فایل ها و صفحات وب را تایپ می نمائیم ( مثلا" C:Mywebsite ) .
*

از لیست Language ، یکی از گزینه های # Visual Basic ، Visual C و یا # Visual J را انتخاب می نمائیم ( زبان برنامه نویسی انتخاب شده در این مرحله به عنوان گزینه پیش فرض برای وب سایت در نظر گرفته خواهد شد . در یک برنامه وب می توان از چندین زبان برنامه نویسی استفاده نمود و متناسب با شرایط موجود در زمان ایجاد هر صفحه زبان برنامه نویسی آن را انتخاب نمود ) .
*

انتخاب گزینه OK

شکل زیر ، مراحل اشاره شده را نشان می دهد :

ایجاد یک وب سایت جدید

پس از انجام مراحل فوق ، فولدر محل استقرار فایل ها و یک صفحه جدید با نام Default.aspx ایجاد می گردد .پس از ایجاد صفحه فوق ، به صورت پیش فرض Source view نمایش داده می شود ( در Source view ، می توان عناصر html مربوط به صفحه را مشاهده نمود ) .

نمایش یک صفحه در Source view

پس از ایجاد ساختار اصلی وب سایت ،‌ در ادامه می توان یک فرم وب جدید را متناسب با خواسته موجود ایجاد نمود .
ایجاد یک فرم وب جدید
پس از ایجاد یک وب سایت جدید ، ویژوال استودیو یک صفحه ASP.NET ( صفحات فرم های وب ) را با نام Default.aspx ایجاد می نماید. در صورت تمایل می توان صفحه فوق را به عنوان صفحه اصلی سایت در نظر گرفت . در ادامه با نحوه ایجاد یک صفحه وب جدید آشنا می شویم . بدین منظور مراحل زیر را دنبال می نمائیم :

*

صفحه Default.aspx را غیر فعال نمائید ( close )
*

از طریق Solution Explorer ، بر روی وب سایت مورد نظر کلیک سمت راست نموده و گزینه Add New Item را انتخاب نمائید .

اضافه کردن یک آیتم جدید به وب سایت

*

در پنجره Visual Studio installed templates ، گزینه Web Form را انتخاب نمائید .
*

در فیلد Name ، یک نام دلخواه برای صفحه وب را تایپ نمائید ( نظیر FirstWebpage )
*

در لیست Language ، زبان برنامه نویسی مورد نظر خود را انتخاب نمائید ( #Visual Basic , C و یا #J ) . توجه داشته باشید با این که در زمان ایجاد وب سایت ، زبان پیش فرض برای وب سایت مشخص شده است ولی هر مرتبه که یک صفحه و یا عنصر جدید ایجاد می گردد، می توان زبان پیش فرض انتخاب شده را تغییر داد . همانگونه که قبلا" نیز اشاره گردید ، در یک وب سایت می توان از زبان های برنامه نویسی متفاوتی استفاده نمود .
*

CheckBox مربوط به Place Code in Separate file را غیر فعال نمائید .( در این مثال ، از یک فایل برای ذخیره کد ها و تگ های html استفاده شده است . در صورت تمایل می توان کد صفحات ASP.NET را در یک صفحه و یا کلاس فایل جداگانه ذخیره نمود) .

شکل زیر ، مراحل اشاره شده را نشان می دهد :

افزودن تگ های Html به صفحه
برای افزودن تگ های Html به یک صفحه مراحل زیر را دنبال می نمائیم :

*

در بخش پائین صفحه بر روی گزینه Design tab کلیک نموده تا به Design view سوئیچ نمائید . در Design view ، صفحه ای که با آن کار می کنید به صورت WYSIWYG نمایش داده می شود . با توجه به این که تاکنون متن و یا محتویات خاصی در صفحه تایپ نشده است ، این بخش خالی است .
*

بر روی صفحه متن مورد نظر خود را تایپ نمائید ( ایجاد اولین صفحه با استفاده از ویژوال استودیو 2005 )

درج متن در Design view

*

به Source View سوئیچ نمائید . در این مرحله شما تگ های Html را مشاهده می نمائید که در Design View ایجاد شده اند.

مشاهده تگ های html در Source view

اجرای صفحه
قبل از افزودن کنترل به صفحه ، می توان صفحه را اجراء نمود . برای اجرای یک صفحه به یک سرویس دهنده وب نیاز است. در یک وب سایت عملیاتی و نهائی ، از IIS به عنوان سرویس دهنده وب استفاده می گردد . برای تست یک صفحه ، شما می توانید از ASP.NET Development Server که به صورت محلی اجراء شده است (به IIS نیاز نمی باشد) ،‌ استفاده نمائید . برای وب سایت های مبتنی بر فایل ، سرویس دهنده وب پیش فرض ASP.NET Development Server می باشد .
برای اجرای صفحه موارد زیر را دنبال می نمائیم :

*

فعال کردن کلیدهای CTRL+F5 برای اجراء صفحه
*

برنامه VWD ، سرویس دهنده ASP.NET Development Server را آغاز می نماید. یک Icon درقسمت پائین toolbar نمایش داده شده و نشاندهنده این موضوع است که سرویس دهنده وب VWD فعالیت خود را آغاز نموده است (ASP.NET Development Server ) .
*

در ادمه ، صفحه در مرورگر نمایش داده می شود . با این که صفحه ای که ایجاد نموده اید دارای یک انشعاب aspx . است ولی اجرای آن همانند یک صفحه HTML است .
(در صورتی که با پیام خطای 502 برخورد نمائید و پیامی مبنی بر عدم امکان نمایش صفحه نمایش داده شود ، می بایست تنظیمات مرورگر را بگونه ای انجام داد که از سرویس دهنده پراکسی استفاده ننماید ) .

اجرای صفحه و مشاهده آن در مرورگر

در بخش دوم ، به بررسی مراحل دوم ( افزودن کنترل به صفحه ) و سوم ( نوشتن روتین های پاسخگو در زمان بروز یک رویداد ) ، خواهیم پرداخت .