بسم الله والحمد لله والصلاة والسلام على رسول الله وبعد،،
أحببت أن أشارك بهذه المقالة والتي اجتهدت في ترجمتها من اللغة الإنجليزية إلى اللغة العربية فلعل البعض أن يجد فيها الفائدة.
وأعتذر مقدماً لجميع الأخوة عن وجود أي ملاحظات حول الترجمة أو الأسلوب ،وليكرمني الجميع بالإقتراح والتصويب والتعليق وللجميع أطيب تحياتي.
لابأس من تأجيل الإشارة إلى المصدرالأصلي لهذه المقالة في نهاية الجزء الثاني منها فإلى المقالة:
المقدمة
في الإصدارات الأحدث لـ Microsoft Access، بذل جهد عظيم للوصول بهذا المنتج ليصبح نظام قواعد بيانات علائقي كامل الميزات. الإجراءات المخزنة Stored procedures وظيفة طالما اقترنت بأنظمةِ قواعد البيانات المؤسسية مثل SQL Server، هذه الوظيفية يمكنك أن تجدها الآن في Microsoft Access. فالإجراءات المَخْزُونة في Microsoft Access أصبحت متاحة مع الإصدار2000 Access والمحرك النفاث4 لقاعدة البيانات Jet 4 Database Engine. وحتى إن كنت ممن تعود على استخدام الإجراءات المخزنة في SQL Server فستكون من المهتمين بالتعرف على كيفية استخدامها في Access. على كلاً يوجد بَعْض القيود سنذكره لاحقاً في هذ الجزء من المقالة.
سيتم تقسيم هذه المقالةِ إلى جزئين: الجزء الأول سيتناول بالتفصيل كَيفَية إنشاء Stored procedures في Access باستخدام ADO.NET مع Visual Basic.NET. الجزء الثاني سيعرض من خلاله كيفية استخدام الإجراءات المَخزنة Stored procedures المنشئة في الجزء الأول من المقالة بتَجميع طبقة الوصول للبيانات data access tier الذي يُمْكِنُ أَنْ يشكل ويستخدم في تطبيقاتِكَ الخاصةِ. الكود في هذه المقالةِ تم تطبيقه باستخدام الإصدار2002 Access ، ويفترض أَنْ يَعْملَ أيضاً مع نسخة 2000 Access.
كَيفَ تعمل الإجراءات المخزنة في Access؟
بخلاف الكائنات الأخرى في Access الإجراءاتَ المخزنة لَيْسَ لَها واجهة ولا يُمْكن أنْ تنشئ أَو تشغل من خلال واجهة المستخدم في Access. والطريقة الوحيدة لذلك هي ببساطة كتابة الكود. سأريكم كيف يتم ذلك في ADO.NET.( مع تحفظي الشخصي على هذه المعلومة فبالإمكان القيام بذلك من خلال مصمم الإستعلام)
عند إضافة إجراءَ مخزن stored procedure إلى قاعدة بيانات Access يعيد المحرك النفّاثَ Jet Engine صياغة الإجراءِ المَخزونِ إلى كائن استعلام query object. بالنسبة لمطورِ Access قَدْ يَبْدو مثل هذا العملِ غير ضروريِ لتَشْفير الإستعلام كونه يمكن أن يقوم بذلك مباشرة. إلا أنه وعلى العكس من ذلك فلهذا العمل فوائده. انظرعندما يتطلب الأمر التعامل أو التنقل بين نسختين مختلفتين قاعدة بيانات Access وقاعدة بيانات خادمِ SQL. فاستخدام الإجراءات المخزنة ستجعل الأمر أكثر سهولة لكِتابَة كود لطبقة قاعدةَ بيانات التطبيقِ فالتغييرات في البرنامج بين النسخِ المختلفة ستكون طفيفة جداًِ.
إنشاء الإجراءات المخزنة
لتوضيح ذلك سأريك أولاً كَيفية إنشاء جمل SQL التي تقوم بإنشاء الإجراءاتِ المخزنة. في نهاية المقالة سأعرض كامل الكود المطلوب لتشغيل هذه الجمل على قاعدة البيانات. سنستخدم قاعدة بيانات Northwind والتي تأتي ضمن Access وسيتم إنشاء أربعة إجراءاتِ مخزنة. سنركز في جميع الإجراءات على جدول المنتَجاتِ Products . دعنا نبدأُ بأول الأربعة سهولة وهو اختيار كامل البيانات لجميع سجلات الجدول. لإنشاء الإجراءِ المخزونِ نفذ جملة SQL التالية على قاعدةِ البيانات:
"CREATE PROC procProductsList AS SELECT * FROM Products;"
الجزء: "CREATE PROC procCustomerList" هو في الحقيقة الجزء الذي ينشئ الإجراءَ المخزن. والجزءِ الذي يلي "AS" فيمكن أَن يكون أي جملة SQL صحيحِة.
في أغلب الأحيان ستحتاج إلى تمرير قيمة إلى الإجراء المخزن stored procedure وهذه القيمة ستستخدم في الاستعلام. أفترض أنك ترغب حذف سجل على أساس رقم المنتج ProductID لهذا السجل. الإجراء المخزن التالي يمكنك من الإطلاع على كَيفَية القيام بذلك:
"CREATE PROC procProductsDeleteItem(inProductsID LONG)" & _ "AS DELETE FROM Products WHERE ProductsID = inProductsID;"
لاحظ في نهاية السطر الأول على اليمين بعد علامة التنصيص وبعد الإعلانِ CREATE PROC. وجود بارامتر معرف كـ قيمة من النوع Long . وهي القيمة التي تمثل قيمة المتغير الذي يمثل رقم المنتج المراد حذفه.
الجملتين التاليتين توضحان على التوالي كَيفَية إنشاء إجراء مخزن لإضافة وتحديث جدول المنتجات. لاحظ عدم اشتمال الجملتين على جميع الحقول وذلك بقصد الإختصار:
"CREATE PROC procProductsAddItem(inProductName VARCHAR(40), " & _ "inSupplierID LONG, inCategoryID LONG) " & _ "AS INSERT INTO Products (ProductName, SupplierID, CategoryID) " & _ "Values (inProductName, inSupplierID, inCategoryID);" "CREATE PROC procProductsUpdateItem(inProductID LONG, " & _ " inProductName VARCHAR(40)) " & _ "AS UPDATE Products SET ProductName = inProductName " & _ " WHERE ProductID = inProductID;"
لاحظ وجود الفاصلة لفصل كل بارامتر عن الآخر وذلك عند وجود بارامترات متعددة.
قيود ومحاذير
نذكر هنا بَعْض المحاذيروالقيود التي قَد تصادفك خلال العمل، خصوصاً إذا اعتدت عَلى قوة SQL Server.
البارامترات من نوع Output غير ممكن استخدامها.
لا تستخدم الرمز @ . فالرمز @ يستخدم في أغلب الأحيان من قبل Transact SQL (SQL Server)، حيث يمثل متغير محلي. Access لا يحول هذا الرمز دائماً وأحياناً يتركه أو يتجاهله أو يهمله. وهذا يمكِن أَن يتسبب في حدوث خطأ خفي يمكِن أَنْ يؤدي إلى فقدانِ السلاسل الغير تامة.
الجداول المؤقتة Temporary tables غير متوفرة في Access.
توقع وجود العديد مِن الخيارات المتوفرة في Transact SQL وغير المتوفرَة في Access نظراً لعدم توافقه مع Transact SQL.
الخاتمة
آمل أن تكون هذه المقالة قد سلطت الضوء على جانب قد يكون غائب عن البعض. الأسطر التالية تشتمل على كامل الكود المقدم في هذه المقالة.
لاحظ: مسار قاعدة البيانات المستخدم هو:
C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb
ويمكنك تغييره بما يتناسب والمسار الموجود لديك.
Imports System Imports System.Data Imports System.Data.OleDb Module CreateSP Sub Main() ProductsProcs() End Sub ' Products Stored Procs to be added to the db. Sub ProductsProcs() Dim sSQL As String ' procProductsList - Retrieves entire table sSQL = "CREATE PROC procProductsList AS SELECT * FROM Products;" CreateStoredProc(sSQL) ' procProductsDeleteItem - Returns the details (one record) from the ' JobTitle table sSQL = "CREATE PROC procProductsDeleteItem(@ProductID LONG) AS " _ & "DELETE FROM Products WHERE ProductID = @ProductID;" CreateStoredProc(sSQL) ' procProductsAddItem - Add one record to the JobTitle table sSQL = "CREATE PROC procProductsAddItem(inProductName VARCHAR(40), " _ & "inSupplierID LONG, inCategoryID LONG) AS INSERT INTO " _ & "Products (ProductName, SupplierID, CategoryID) Values " _ & "(inProductName, inSupplierID, CategoryID);" CreateStoredProc(sSQL) ' procProductsUpdateItem - Update one record on the JobTitle table sSQL = "CREATE PROC procProductsUpdateItem(inProductID LONG, " _ & "inProductName VARCHAR(40)) AS UPDATE Products SET " _ & "ProductName = inProductName WHERE ProductID = inProductID;" CreateStoredProc(sSQL) End Sub ' Execute the creation of Stored Procedures Sub CreateStoredProc(ByVal sSQL As String) Dim con As OleDbConnection Dim cmd As OleDbCommand = New OleDbCommand() Dim da As OleDbDataAdapter ' Change Data Source to the location of Northwind.mdb on your local ' system. Dim sConStr As String = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data " _ & "Source=C:\Program Files\Microsoft " _ & "Office\Office10\Samples\Northwind.mdb" con = New OleDbConnection(sConStr) cmd.Connection = con cmd.CommandText = sSQL con.Open() cmd.ExecuteNonQuery() con.Close() End Sub End Module
في الملف المرفق مثال يحتوي على ماسبق يعمل على VB.NET 2005
العمل مع الإجراءات المخزنة Stored Procedures في Microsoft Access من خلالVB.NET الجزء الثاني والأخير
