في المقالة السابقة تحدثت عن مجموعة من الاساسيات التي توفرها Dapper وهي الـ CRUD وقد شرحت أن Dapper تعتمد على الواجهة IDbConnection وبالتالي في جميع حالات التنفيذ على قاعدة البيانات نقوم بإستخدام الاسلوب Execute أما في حالة الإستعلام نقوم بإستخدام الاسلوب Query مصحوبا بالنوع او الكائن المراد الإستعلام عنه Query<T>.
بإمكانك قراءة المقالة الأولى من الرابط التالي:
مقدمة عن Dapper من خلال بيئة الـ DotNet
ويتوجب عليك قراءتها (المقالة الأولى) إذا كنت تريد التطبيق في هذه المقالة الجديدة.
في هذه المقالة الثانية سنتطرق لطريقة استخدام الإجراءات المخزنة Stored Procedures وسأقوم بإستخدام نفس التطبيق الذي استخدمته في المقالة الأولى.
سأقوم بإستخدام قاعدة البيانات NORTHWIND التي قمت بإستخدامها سابقا.
في قاعدة البيانات تلك توجد 7 إجراءت مخزنة..ولقد قمت بإضافة إجراء مخزن لقاعدة البيانات تلك يقوم بإرجاع جميع التصنيفات Categories وهذا الإجراء لايوجد به أي معامل بل يقوم بإرجاع حميع المعلومات الموجودة بالجدول، والإجراء الذي أنشأته كالتالي:
CREATE PROCEDURE [dbo].[GetAllCategories] AS BEGIN SELECT CategoryName,Description FROM Categories END GO
وفي حال أردت تنفيذ الإجراء في صفحة إستعلام من داخل الفيجوال ستديو أو على الـ SQL Management Studio قم بكتابة السطر التالي:
EXEC dbo.GetAllCategories
حسنا لتنفيذ ذلك الإجراء داخل مشروعنا (DemoDapper) لقد قمت بإنشاء فئة جديدة بإسم Categories وبها الخصائص التالية (نفس الحقول الموجودة بالجدول داخل قاعدة البيانات):
public class Categories { public Int32 CategoryID { get; set; } public string CategoryName { get; set; } public string Description { get; set; } public byte[] Image { get; set; } }
الآن سنقوم بكتابة الأسلوب الذي يتيح لنا إستدعاء الإجراء المخزن ..قم بفتح الفئة DapperRespository.cs وقم بلصق الشفرة التالية داخل تلك الفئة:
public IEnumerable<Categories> FindAllCat() { var spGetAllCategories = "GetAllCategories"; using (IDbConnection db = new SqlConnection(con)) { var affectedRows = db.Query<Categories>(spGetAllCategories, CommandType.StoredProcedure); return affectedRows; } }
بكل بساطة هذه هي طريقة التعامل مع الإجراءات المخزنة من خلال تقنية Dapper … طالما سنقوم بعمل إستدعاء لمجموعة بيانات سنقوم بإستخدام الإسلوب Query<T> وسنقوم بإسناء Categories كنوع البيانات T التي نريد إرجاعها وهذا الإسلوب يقبل العديد من المعاملات Parameters وفي حال قمت بالضغط على زر F12 أثناء تحديد المؤشر على الأسلوب نفسه سينقلك للصفحة التي بها جميع الطرق التي يمكن ان ينفذ بها هذا الاسلوب .. وقد قمنا بإستخدام تلك الطريقة:
public static IEnumerable<T> Query<T>(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null);
حيث في أول معامل قمنا بإسناد الاستعلام الذي نود إرجاعه وهو من النوع النصي String وفي المعامل الثاني قمنا بتحديد نوع الإستعلام والذي هو عبارة عن إجراء مخزن Stored Procedure.
في حال أردت رؤية المجموعات على صفحة WebForm قم بعمل صفحة WebForm جديدة وقم بتسميتها SiteCategory.aspx وفي جزء الـ Source قم بلصق الشفرة التالية داخل الـ Form
<div> <asp:ListView ID="listview" runat="server" ItemPlaceholderID="listcontents"> <LayoutTemplate> <div> <h1>All Category </h1> </div> <div runat="server" id="listcontents"> </div> </LayoutTemplate> <ItemTemplate> <asp:Label runat="server" ID="lblName" Text='<%# Eval("CategoryName") %>' /> | <asp:Label runat="server" ID="lblDescription" Text='<%# Eval("Description") %>' /> </ItemTemplate> <ItemSeparatorTemplate> <hr /> </ItemSeparatorTemplate> </asp:ListView> </div>
في صفحة الـ cs لصفحة الـ SiteCateory قم بلصق الشفرة التالية: وتلك الشفرة تقوم بإسناد جميع المجموعات التي قمنا بالإستعلام عنها داخل الأسلوب FindallCat في الفئة DapperRepository.cs ؛ تقوم بإسناد جميع المجموعات في أداة الـ ListView
using DemoDapper.Models; private DapperRepository dr = new DapperRepository(); protected void Page_Load(object sender, EventArgs e) { var query = dr.FindAllCat(); listview.DataSource = query.ToList(); listview.DataBind(); }
والنتيجة ستكون كما في الصورة التالية:
حسنا الآن لقد عرفنا كيفية التعامل مع الإجراء المخزن الذي لا يحتوي على أي معامل Parameter ؛ لكن ماذا لو أردت أستدعاء إجراء مخزن يوجد به معامل Parameter
دعنا نقوم بإنشاء إجراء مخزني جديد داخل قاعدة البيانات NORTHWIND .. قم بلص الشفرة التالية على صفحة إستعلام جديدة وقم بتنفيذها
CREATE PROCEDURE [dbo].[GetCategoryByID] @Id int AS SELECT CategoryName, Description from Categories where CategoryID = @Id RETURN 0
وللتأكد من عملها بصورة صحيحة بإمكانك الإستعلام عنها بإستخدام الشفرة التالية في صفحة استعلام جديدة
EXEC GetCategoryByID 1;
وستكون النتيجة كالتالي كما موضحة بالصورة التالية:
حسنا الآن قم بفتح الفئة DapperRepository.cs وقم بكتابة الإسلوب التالي:
public Categories GetCategory(int id) { var spGetCategoryByID = "GetCategoryByID"; using (IDbConnection db = new SqlConnection(con)) { return db.Query<Categories>(spGetCategoryByID, new { @Id = id }, CommandType.StoredProcedure).SingleOrDefault(); } }
كل ما قمنا به هو إسناد المعامل الموجود بالإجراء المخزني بصورة مجهولة Anonymous بنفس الاسم الموجود بالإجراء المخزني.
كمطور برمجيات في حال اردت التعامل بسهولة مع قواعد البيانات بإمكانك استخدام Dapper لعمل جميع الإستعلامات في تطبيقاتك فهي لا ترهق قاعدة البيانات بعكس الـ Entity Framewrok بالتالي كل ما يتعيّن عليك أن هو ان تكون قادرا على كتابة جمل الـ SQL بصورة صحيحة.
سأقوم بتحديث هذه المقالة حتى نتعرف على مميزات جديدة ومتقدمة في طريقة تعامل Dapper مع قواعد البيانات. وبعد الإنتهاء من السلسلة سأشير لذلك في عنوان المقالة نفسها
تحياتي.