العنوان الأصلي: http://www.51la.org/webjx/htmldata/2005-12-24/1135405777.html
تُستخدم استدعاءات الإجراءات المخزنة بشكل شائع في أنظمة b/s. طريقة الاتصال التقليدية ليست بطيئة فحسب، بل ستستمر التعليمات البرمجية في التوسع مع زيادة عدد الإجراءات المخزنة، مما يجعل من الصعب صيانتها. الطريقة الجديدة تحل هذه المشاكل إلى حد ما.
الكلمات الرئيسية asp.net؛ الإجراءات المخزنة في عملية استخدام .net، يعد الوصول إلى قاعدة البيانات جزءًا مهمًا جدًا، خاصة في عملية بناء نظام b/s، وقد أصبح تشغيل قاعدة البيانات عملية أساسية تقريبًا. يعد استدعاء الإجراءات المخزنة لتنفيذ عمليات قاعدة البيانات طريقة يستخدمها العديد من المبرمجين، ويستخدم معظم المبرمجين الإجراءات المخزنة إذا استطاعوا، ونادرا ما يستخدمون عبارات SQL مباشرة، لذا فإن الإجراءات المخزنة مفيدة ومهمة للغاية.
مقدمة إلى الإجراءات المخزنة
ببساطة، الإجراء المخزن هو إجراء مغلف يتكون من بعض عبارات SQL وبيانات التحكم، وهو موجود في قاعدة البيانات ويمكن استدعاؤه بواسطة تطبيق العميل أو من إجراء أو مشغل آخر. يمكن تمرير معلماتها وإعادتها. كما هو الحال مع الإجراءات الوظيفية في التطبيق، يمكن استدعاء الإجراءات المخزنة بالاسم، كما أنها تحتوي أيضًا على معلمات الإدخال والإخراج.
وفقًا لأنواع قيم الإرجاع المختلفة، يمكننا تقسيم الإجراءات المخزنة إلى ثلاث فئات: الإجراءات المخزنة التي تُرجع مجموعات السجلات، والإجراءات المخزنة التي تُرجع قيمًا عددية (وتسمى أيضًا الإجراءات المخزنة العددية)، والإجراءات المخزنة السلوكية. كما يوحي الاسم، فإن نتيجة تنفيذ الإجراء المخزن الذي يُرجع مجموعة سجلات هي مجموعة سجلات. والمثال النموذجي هو استرداد السجلات التي تفي بشرط واحد أو عدة شروط من قاعدة البيانات؛ بعد التنفيذ، على سبيل المثال، في قاعدة البيانات، قم بتنفيذ وظيفة أو أمر بقيمة إرجاع، وأخيرًا، يتم استخدام الإجراء السلوكي المخزن فقط لتنفيذ وظيفة معينة في قاعدة البيانات دون قيمة إرجاع، مثل عمليات التحديث والحذف في قاعدة البيانات؛ .
فوائد استخدام الإجراءات المخزنة
بالمقارنة مع الاستخدام المباشر لعبارات SQL، فإن استدعاء الإجراءات المخزنة مباشرة في أحد التطبيقات له الفوائد التالية:
(1) تقليل حركة مرور الشبكة. قد لا يكون هناك فرق كبير في حركة مرور الشبكة بين استدعاء إجراء مخزن مع عدد صغير من الصفوف واستدعاء عبارات SQL مباشرة، ومع ذلك، إذا كان الإجراء المخزن يحتوي على مئات من عبارات SQL، فمن المؤكد أن أدائه أفضل من استدعاء عبارات SQL واحدة تلو الأخرى واحد أعلى من ذلك بكثير.
(2) سرعة التنفيذ أسرع. هناك سببان: أولاً، عند إنشاء الإجراء المخزن، تكون قاعدة البيانات قد قامت بالفعل بتحليله وتحسينه مرة واحدة. ثانيًا، بمجرد تنفيذ الإجراء المخزن، سيتم الاحتفاظ بنسخة من الإجراء المخزن في الذاكرة، بحيث يمكن استدعاؤه مباشرة من الذاكرة في المرة التالية التي يتم فيها تنفيذ نفس الإجراء المخزن.
(3) قدرة أكبر على التكيف: نظرًا لأن الإجراءات المخزنة تصل إلى قاعدة البيانات من خلال الإجراءات المخزنة، فيمكن لمطوري قواعد البيانات إجراء أي تغييرات على قاعدة البيانات دون تغيير واجهة الإجراء المخزن، ولن تؤثر هذه التغييرات على قاعدة البيانات.
(4) العمل الموزع: يمكن تنفيذ أعمال الترميز للتطبيق وقاعدة البيانات بشكل مستقل دون قمع بعضها البعض.
من التحليل أعلاه، يمكننا أن نرى أنه من الضروري استخدام الإجراءات المخزنة في التطبيقات.
طريقتان مختلفتان لاستدعاء الإجراءات المخزنة
لتسليط الضوء على مزايا الطريقة الجديدة، دعنا أولاً نقدم الطريقة "الرسمية" لاستدعاء الإجراءات المخزنة في .net. بالإضافة إلى ذلك، تعمل كافة نماذج البرامج الواردة في هذه المقالة على قاعدة بيانات sqlserver. وهناك حالات أخرى متشابهة ولن يتم شرحها واحدًا تلو الآخر في المستقبل. جميع الأمثلة في هذه المقالة مكتوبة بلغة C#.
للوصول إلى قاعدة البيانات في أحد التطبيقات، الخطوات العامة هي: أولاً الإعلان عن اتصال قاعدة البيانات sqlconnection، ثم الإعلان عن أمر قاعدة البيانات sqlcommand لتنفيذ عبارات SQL والإجراءات المخزنة. باستخدام هذين العنصرين، يمكنك استخدام طرق تنفيذ مختلفة لتحقيق أهدافك وفقًا لاحتياجاتك الخاصة. ما يجب إضافته هو أنه لا تنس إضافة البيان المرجعي التالي إلى الصفحة: باستخدام system.data.sqlclient.
فيما يتعلق بتنفيذ الإجراءات المخزنة، إذا تم تنفيذ النوع الأول من الإجراءات المخزنة، فيجب استخدام محول البيانات لملء النتائج في مجموعة بيانات، ومن ثم يمكن استخدام التحكم في شبكة البيانات لتقديم النتائج على الصفحة؛ إذا تم تنفيذه إذا كان الإجراء المخزن الثاني والثالث، فلن تكون هناك حاجة إلى هذا الإجراء، ما عليك سوى تحديد ما إذا كانت العملية قد اكتملت بنجاح بناءً على الإرجاع المحدد.
(1) الكود الخاص بتنفيذ إجراء مخزن بدون معلمات هو كما يلي:
sqlconnection conn=new sqlconnection("connectionstring");
sqldataadapter da = new sqldataadapter();
da.selectcommand = new sqlcommand();
da.selectcommand.connection = conn;
da.selectcommand.commandtext = "nameofprocedure";
da.selectcommand.commandtype = Commandtype.storedprocedure;
ثم ما عليك سوى اختيار الطريقة المناسبة لتنفيذ العملية هنا لأغراض مختلفة.
(2) رمز تنفيذ الإجراء المخزن باستخدام المعلمات هو كما يلي (يمكننا إعلان الوظيفة التي تستدعي الإجراء المخزن على أنها exeprocedure (تاريخ إدخال السلسلة)):
sqlconnection conn=new sqlconnection("connectionstring");
sqldataadapter da = new sqldataadapter();
da.selectcommand = new sqlcommand();
da.selectcommand.connection = conn;
da.selectcommand.commandtext = "nameofprocedure";
da.selectcommand.commandtype = Commandtype.storedprocedure;
(الرمز أعلاه هو نفسه، وفيما يلي الرمز الذي سيتم إضافته)
param = new sqlparameter("@parametername"، sqldbtype.datetime);
param.direction =paramdirection.input;
param.value = converter.todatetime(inputdate);
da.selectcommand.parameters.add(param);
يؤدي هذا إلى إضافة معلمة إدخال. إذا كنت بحاجة إلى إضافة معلمات الإخراج:
param = new sqlparameter("@parametername"، sqldbtype.datetime);
param.direction =paramdirection.output;
param.value = converter.todatetime(inputdate);
da.selectcommand.parameters.add(param);
للحصول على القيمة المرجعة لإجراء المعلمة المخزنة:
param = new sqlparameter("@parametername"، sqldbtype.datetime);
param.direction =paramdirection.returnvalue;
param.value = converter.todatetime(inputdate);
da.selectcommand.parameters.add(param);
من الكود أعلاه، يمكننا أن نرى أنه عندما يكون هناك العديد من الإجراءات المخزنة أو هناك العديد من المعلمات في الإجراءات المخزنة، فإن هذه الطريقة ستؤثر بشكل كبير على سرعة التطوير، ومن ناحية أخرى، إذا كان المشروع كبيرًا نسبيًا، فستكون هذه الوظائف مناسبة سيكون منطق قاعدة البيانات أيضًا عبئًا كبيرًا في الصيانة المستقبلية. فهل هناك طريقة محسنة لحل هذه المشكلة؟ اعتقدت أنه عند تنفيذ إجراء مخزن بدون معلمات، نحتاج فقط إلى تمرير اسم الإجراء المخزن لاستدعاء الإجراء المخزن المقابل، وفي قاعدة بيانات sqlserver، يمكننا كتابة "اسم الإجراء المخزن (قائمة المعلمات) مباشرة" " في محلل الاستعلام. يمكن تنفيذ الإجراءات المخزنة باستخدام مثل هذه السلاسل. فهل يمكن تطبيق هذه الفكرة على التطبيقات؟
لذا اكتب الكود المقابل في المترجم. يتم تعديل هذه الرموز بناءً على التعليمات البرمجية التي تستدعي الإجراء المخزن بدون معلمات. الكود المحدد هو كما يلي:
sqlconnection conn=new sqlconnection("connectionstring");
sqldataadapter da = new sqldataadapter();
da.selectcommand = new sqlcommand();
da.selectcommand.connection = conn;
da.selectcommand.commandtext = "nameofprocedure('para1','para2',para3)";
da.selectcommand.commandtype = Commandtype.storedprocedure;
من أجل جعل التعليمات البرمجية أكثر تمثيلاً، تكون المعلمات الأولى والثانية للإجراء المخزن المطلوب استدعاؤها من نوع السلسلة، والمعلمة الثالثة من النوع الصحيح. وبعد التنفيذ وجدت أن النتائج المتوقعة يمكن تحقيقها!
مقارنة بين طريقتي الاستدعاء من خلال المقارنة، يمكننا أن نرى أن الطريقة الثانية لها ميزة واضحة، وهي أنها يمكن أن تزيد من سرعة التطوير، وتوفر وقت التطوير، كما أن الكود سهل الصيانة، كما أنه يقلل من حجم النظام إلى حد ما. ومع ذلك، نظرًا لأن معالجة معلمات الإجراء المخزن عامة نسبيًا، إذا كنت ترغب في الحصول على معلمات الإخراج أو الحصول على القيمة المرجعة لإجراء مخزن، فلن تتمكن هذه الطريقة من تلبية الاحتياجات. ومع ذلك، يمكن لهذه الطريقة أن تسمح للمطورين بحفظ جزء كبير من التعليمات البرمجية. إذا لم تكن بحاجة إلى الحصول على معلمات الإخراج وقيم الإرجاع، فيمكنك القيام بذلك "مرة واحدة وإلى الأبد". لذلك، في التطوير الفعلي للبرنامج، لا تزال هذه الطريقة لها قيمة عملية معينة.