جستجو در محصولات

گالری پروژه های افتر افکت
گالری پروژه های PSD
جستجو در محصولات


تبلیغ بانک ها در صفحات
ربات ساز تلگرام در صفحات
ایمن نیوز در صفحات
.. سیستم ارسال پیامک ..
بازيابي Scalar Data با استفاده از Stored Procedure
-(6 Body) 
بازيابي Scalar Data با استفاده از Stored Procedure
Visitor 1700
Category: دنياي فن آوري
بانك هاي اطلاعاتي داراي نقشي اساسي در اكثر برنامه هاي كامپيوتري بوده و برنامه هاي وب نيز از اين قاعده مستثني نمي باشند . اكثر برنامه هاي وب نوشته شده با استفاده از 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 استفاده گردد .
منبع: http://www.4guysfromrolla.com
Add Comments
Name:
Email:
User Comments:
SecurityCode: Captcha ImageChange Image