فراخوانی Stored Procedure با استفاده از Framework

پنجشنبه 19 آذر 1394

روال های ذخیره اشیا قابل اجرا در پایگاه داده هستند که شامل یک سری دستورات می باشند در این مقاله کلاس هایی که لازم است تا بتوان از درون Framework روال های ذخیره شده را فراخوانی کرد معرفی شده است .

فراخوانی Stored Procedure با استفاده از Framework

همان طور که میدانید Stored Procedure یا روال های ذخیره شده که به اختصار به آنها SP می گوییم اشیا قابل اجرا در پایگاه داده هستند که شامل یک سری دستورات می باشند.این روال ها میتوانند پارمتر ورودی بگیرند و همچنین می توانند خروجی برگردانند.
تفاوتی که SP ها با توابع دارند این است که SP ها یک بار کامپایل می شوند و در دفعات بعدی فراخوانی می شوند اما توابع در هر بار فراخوانی باید دوباره کامپایل شوند.توابع باید حتما خروجی داشته باشند ولی SP ها لزوما اینطور نیستند .

اصلی ترین نوع Stored Procedure آنهایی هستند که که هیچ پارامتری نمی گیرند خروجی هم برنمی گردانند.مانند یک Stored Procedure که مقداری را در بانک تغییر می دهد.این  Stored Procedure ها از جدول تنظیمات و یا توابع درونی پایگاه داده استفاده می کنند.برای مثال در کد زیر یک Stored Procedur نوشته شده است که فیلد LastUpdatedDateTime را در جدول Account را تنظیم مجدد می کند.

CREATE PROCEDURE [dbo].[AccountLastUpdatedDateTimeReset]
 AS
 BEGIN
     UPDATE
         [app].[Account]
     SET
         [LastUpdatedDateTime] = GETDATE();
 END


حال برای فراخوانی این Stored Procedure با استفاده از framework به کلاسی نیاز داریم که این Stored Procedure را معرفی کنیم .نام این کلاس را AccountLastUpdatedDateTimeReset می گذاریم .برای اینکه framework بداند چگونه از این کلاس استفاده کند باید آنرا از کلاس StoredProcedureBase ارث بری کنیم .
الگوی کلاس StoredProcedureBase در اینجا آورده شده است

public abstract class StoredProcedureBase<TReturn, TParameters> {...}

همان طور که می بینید این کلاس دو پارامتر دارد پارامتر اول مشخص کننده نوع خروجی است که قرار است Stored Procedure ما بازگرداند.وپارامتر دوم تعریف نوع پارامتر StoredProcedure است .اما از آنجایی که روالهای ذخیره شده یا Stored procedure هایی که در اینجا قصد معرفی آنها را داریم بدون پارامتر ورودی هستند و همچنین خروجی ندارند ، بنابراین باید به صورت خارجی اقدام به تعریف این نوع کلاس برای معرفی StoredProcedure خود بکنیم .
دو کلاس NullStoredProcedureResult و NullStoredProcedureParameters در داخل فضای نام Dibware.StoredProcedureFramework وجوددارند که به ما در معرفی روالهای ذخیره شده اساسی کمک می کنند.کلاس NullStoredProcedureResult زمانی استفاده می شود که پروسیجر یا روال ذخیره شده ما هیچ مقداری را به عنوان خروجی برنمی گرداند.

/// <summary>
/// An object that represents the absence of an
/// expected result from a stored procedure
/// </summary>
public class NullStoredProcedureResult
{
}


کلاس NullStoredProcedureParameters زمانی استفاده می شود که روال ذخیره شده ما هیچ پارامتری ندارد

/// <summary>
 /// An object that represents the absence of parameters
 /// for a stored procedure
 /// </summary>
 public class NullStoredProcedureParameters
 {
 }


با توجه به مطالب گفته شده برای معرفی روال ذخیره شده خود می توانیم به صورت زیر عمل کنیم

internal class AccountLastUpdatedDateTimeReset
    : StoredProcedureBase<NullStoredProcedureResult, NullStoredProcedureParameters>
{
    public AccountLastUpdatedDateTimeReset()
        : base(new NullStoredProcedureParameters())
    {
    }
}


ولی کد بالا مشکلی که دارد این است که مقداری برای SPهایی که اینقدر ساده هستند کمی پیچیده است بنابراین framework کلاس دیگری رامعرفی میکند نام این کلاس NoParametersNoReturnTypeStoredProcedureBase است که کلاس SP ما می تواند از آن ارث بری کن. به کد زیر توجه کنید .

internal class AccountLastUpdatedDateTimeReset
     : NoParametersNoReturnTypeStoredProcedureBase
 {
 }

مانند کلاس قبل نیازی نیست که از سازنده استفاده کنیم بلکه همان سازنده پیش فرض(برای درک مفهوم سازنده ها به مقاله آشنایی با سازنده ها مراجعه کنید) کفایت می کند .توجه داشته باشید که کلاس SqlConnectionExampleTestBase تنها کاری که انجام میدهد این است که Connection را تنظیم می کند.

[TestClass]
public class StoredProcedureWithoutParametersOrReturnType
    : SqlConnectionExampleTestBase
{
    [TestMethod]
    public void AccountLastUpdatedDateTimeReset()
    {
        // ARRANGE
        var procedure = new AccountLastUpdatedDateTimeReset();

        // ACT
        Connection.ExecuteStoredProcedure(procedure);

        // ASSERT
        // Nothing to assert
    }
}

در نمونه ای که ضمیمه این مقاله می باشد نحوه فراخوانی SP ها از طریق Entity Framework ، آورده شده است .


در آخر برای فراخوانی SP ابتدا باید یک نمونه از کلاس بسازیم .بعد آن را به متد الحاقی ExecuteStoredProcedure برای اجرا پاس دهیم .

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید