Dapper عبارة عن Micro-ORM وتختص بعملية الوصول لقاعدة البيانات المرتبطة بالمشروع الذي نعمل عليه ،وهي خفيفة الحجم وسهلة التعامل وعالية في الأداء.
معظم التطبيقات التي ننشئها تتعامل مع قواعد البيانات؛ بالتالي دائما ما نبحث عن طرق الإتصال بين التطبيق وبين قاعدة البيانات… من خلال الجمل الإستعلامية التي تتم كتابتها. ففي فترة من الفترات كنا نستخدم الـ ADO.NET للتعامل مع قواعد البيانات من خلال كتابة الجمل الإستعلامية (SQL) داخل الفيجوال ستديو، وبعدها ظهرت تقنية الـ Entity Framework – EF وهي متضَمنة داخل الفيجوال ستديو ووتيح لنا التعامل مع قواعد البيانات العلائقية سواء SQL Server أو MySQL أو Oracle أو Sybase وغيرها والـ EF تحتوي على ثلاثة أنماط
- Code First
- Model First
- Database First
وبالإمكان استخدام تقنية الـ Language Integrated Query – Linq لكتابة الجمل الإستعلامية وتعتبر من النوع الـ Strongly Type أي تحتوي على خواص التكملة عند الكتابة وإظهار الأخطاء عن تنفيذ التطبيق عكسا من الـ ADO.NET مسبقا.
حسنا…الـ Dapper أيضا تعتبر من أنواع الـ Object-Relational Mapper – ORM وبإختصار عن عملية ربط بين جداول قواعد البيانات مع الفئات الموجودة بالتطبيق. لكن الـ ORM تعتبر مرهقة نوعا ما في التعامل مع قواعد البيانات نسبة للعدد الكبير من الإجراءات التي تقوم بعملها أثناء تحويل الشفرة لجملة SQL وتنفيذها ومن ثم إرجاعها للـ Caller بالتالي الـ Micro-ORM (و Dapper أحد أنواعها) تعتبر خفيفة وغير مرهقة لقاعدة البيانات نسبة لختفها لأنها في الأصل عبارة عن جمل SQL وتقوم بتحويل الصفوف المطلوبة من قاعدة البيانات لمجموعة من العناصر بالتالي الفرق الوحيد والأهم بين الـ ORM والـ Micro-ORM هو السرعة بالنسبة للأخيرة في جلب والتعامل مع البيانات.
في المثال العملي الذي سنتطرق إليه في هذه المقالة والذي أنشئته داخل الفيجوال ستديو 2013 من خلال مشروع Web Form سأوضح طريقة التعامل مع قاعدة البيانات من خلال الجمل الإستعلامية الأربعة الرئيسية CRUD من خلال مكتبة الـ Dapper.
أول ما قمت به تثبيت مكتبة الـ Dapper من خلال الـ Nuget Package بكتابة السطر التالي من خلال الـ Console:
PM> Install-Package dapper
في هذا المشروع سأتعامل مع قاعدة البيانات NOTHWIND والتي بإمكانك تنزيلها من الإنترنت بالبحث عنها من خلال أي محرك بحث من متصفحك.
قمت بإنشاء مشروع Web Form من النوع Empty حيث قمت بتسمية المشروع DemoDapper ، وأول إجراء قمت به هو الربط بين التطبيق وقاعدة البيانات NOTHWIND من خلال ملف الـ Web.Confg كما موضح بالكود التالي:
<connectionStrings> <add name="DapperConnection" connectionString="Data Source=Admin;Initial Catalog=NORTHWND;Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings>
يجب عليك تغيير نوع الإتصال على جهاز إذا كان مختلفا.
قاعدة البيانات NOTHWIND بها مجموعة من الجداول، لكن سأتعامل مع جدول واحد داخلها وهو جدول الـ Region حيث يوجد به حقلين كما مبين بالصورة أدناه:
بالتالي سأقوم بإنشاء فئة Class بنفس اسم الجدول الذي سأتعامل معه داخل المشروع الذي أعمل عليه داخل ملف الـ Models وستكون كالتالي:
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace DemoDapper.Models { public class Region { public int RegionID { get; set; } public string RegionDescription { get; set; } } }
الآن لنفترض أننا نريد أن نقوم بإرجاع جميع البيانات الموجودة داخل جدول الـ Region والموضحة في الصورة أدناه:
حسنا سأنشئ فئة Class جديدة لتكون عبارة عن مستودع Repository سأقوم بكتابة جميع الإستعلامات التي سأحتاجها داخل تلك الفئة وهي بالإسم DapperRepository.cs
حسنا لإستخدام Dapper في استدعاء جميع بيانات حقول الجدول Region سأقوم بكتابة الإستعلام التالي:
string con = ConfigurationManager.ConnectionStrings["DapperConnection"].ConnectionString; public List<Region> FindAll() { using (IDbConnection db = new SqlConnection(con)) { return db.Query<Region>("Select * From Region").ToList(); } }
حسنا سأقوم بشرح الإستعلام.. أولا قمت بتعريف Field بإسم con من النوع String وهو عبارة عن حلقة وصل بين التطبيق وملف الـ Web.config والذي مهتمه ربط التطبيق مع قاعدة البيانات.
الـ Dapper تقوم بعمل Extend للواجهة IDbConnection وهي واجهة رئيسة للتعامل مع قواعد البيانات حيث الـ BaseClass بالنسبة لتلك الواجهة هو الـ DbConnection ، أيضا الـ Query عبارة عن Extension Method تتيح لنا جلب البيانات من قاعدة البيانات ومن ثم العمل عليها وتخزينها داخل العنصر الذي نتعامل معه (Object-Model) والذي في تلك الحالة هو الفئة Region والـ Constructor الذي تقبله له ثلاثة أنواع وما يهمنا في هذه المقالة هو النوع الأول String وهي الجملة التننفيذية التي نريد أن نقوم بتنفيذها على قاعدة البيانات وهي إستجلاب جميع البيانات من الجدول المحدد.
return db.Query<Region>("Select * From Region").ToList();
بالإمكان تعريف Field من النوع String وكتابة الجملة الإستعلامية :إسناد للـ Field ومن ثم إستدعاء داخل الـ Constructor بالنسبة للـ Query<>(string command).
لعرض البيانات على المتصفح قم بإنشاء صفحة Web From وقم بتسميتها Default.aspx وقم بإستخدام Grid View لعرض البيانات ومن خلال الـ Code Behind للصفحة قم بكتابة الشفرة التالية والتي ستستدعي الأسلوب FindAll من الفئة DapperRepository.cs كما مبين تاليا:
private DapperRepository dr = new DapperRepository(); protected void Page_Load(object sender, EventArgs e) { var query = dr.FindAll(); GridView1.DataSource = query.ToList(); GridView1.DataBind(); }
عند تنفيذ المشروع ستظهر معنا البيانات التي عرضتها من داخل الفيجوال ستديو على شاشة المتصفح:
الآن لنفترض أننا نريد أن نقوم بكتابة جملة إستعلامية تقوم بإرجاع قيمة واحدة من قاعدة البيانات ستكون الشفرة كالتالي:
public Region Find(int id) { using (IDbConnection db = new SqlConnection(con)) { return db.Query<Region> ("Select * From Region" + "Where RegionID = @id", new { id }).SingleOrDefault(); } }
توجد أيضا Extension Method أخرى وهي Execute ويمكن إستدعائها لأي Object من النوع IDbConnection وهي تستخدم لـ Insert أو Update أو الـ Delete والـ Stored Procedure الآن فرضا لو أردنا عمل تحديث لحقل ما داخل قاعدة البيانات في الجدول Region سنقوم بكتابة الجملة الإستعلامية التالية:
public int Update(Region region) { using (IDbConnection db = new SqlConnection(con)) { string updateQuery = "UPDATE Region SET RegionDescription = @RegionDescription " + "WHERE RegionID = @RegionID"; int rowsAffected = db.Execute(updateQuery,region); return rowsAffected; } }
أيضا بالنسبة لإدخال حقل جديد ستكون الشفرة كالتالي:
public void InsertTo(Region region) { using (IDbConnection db = new SqlConnection(con)) { string insertQuery = "INSERT INTO Region (RegionDescription) VALUE (@RegionDescription);"; int rowsAffected = db.Execute(insertQuery, region); } }
الملاحظ أننا لا نقوم بأكثر من كتابة جمل الـ SQL الإستعلامية…بالنسبة للحذف سيكون كالتالي:
public void Delete(int id) { using (IDbConnection db = new SqlConnection(con)) { int rowAffectd = db.Execute("DELETE * From Region" + "Where RegionID = @id", new { id }); } }
بهذا أكون قد قدمت مقدمة بسيطة عن الـ Dapper في المقالات القادمة سأتطرق لمجموعة من الإمكانيات العديدة لهذه التقنية خصوصا كيفية التعامل مع الـ Stored Procedure.
تحياتي.
هل اداة dapper مجاني
سلام
اولا شكرا جزيلا على مجهودك ووقتك.
لكن لم توضح قوة الدابر او فوائدها على الادو نت ؟؟؟
كل ما ذكرته ينكن عمله بالكوماند SQLCommand وبدون تعلم جزمة خارجية والخوف من التوافق مع التحديثات وعدم اصلاح الثغرات وغيره.
نصيحة من مبرمج قدبم جدا، دوما استخدم الادوات والتقنيات القياسية.