العملية المخزنة هي أمر SQL واحد أو أكثر مخزنة في قاعدة البيانات ككائنات قابلة للتنفيذ.
التعريفات دائما مجردة. العملية المخزنة هي في الواقع مجموعة من عبارات SQL التي يمكنها إكمال عمليات معينة، ولكن يتم وضع هذه المجموعة من العبارات في قاعدة البيانات (هنا نتحدث فقط عن SQL SERVER). إذا قمنا بإنشاء عملية مخزنة واستدعاء العملية المخزنة في ASP، فيمكننا تجنب خلط عبارات SQL مع كود ASP. هناك ثلاث فوائد على الأقل للقيام بذلك:
أولاً، تحسين الكفاءة بشكل كبير. سرعة تنفيذ العملية المخزنة نفسها سريعة جدًا، ويمكن أن يؤدي استدعاء العملية المخزنة إلى تقليل عدد التفاعلات مع قاعدة البيانات بشكل كبير.
ثانيا، تحسين السلامة. إذا قمت بخلط عبارات SQL في تعليمات برمجية ASP، فبمجرد اختراق التعليمات البرمجية، فهذا يعني أيضًا تعرض بنية المكتبة للاختراق.
ثالثًا، يساعد على إعادة استخدام عبارات SQL.
في ASP، يتم استدعاء العمليات المخزنة بشكل عام من خلال كائن COMMAND، اعتمادًا على الموقف، تقدم هذه المقالة أيضًا طرق استدعاء أخرى. ولتسهيل الشرح، تم إجراء التصنيفات البسيطة التالية بناءً على مدخلات ومخرجات العملية المخزنة:
1. عملية مخزنة تقوم بإرجاع مجموعة سجلات واحدة فقط
لنفترض أن هناك العملية المخزنة التالية (الغرض من هذه المقالة ليس وصف بناء جملة T-SQL، وبالتالي فإن العملية المخزنة تعطي فقط التعليمات البرمجية دون تفسير):
/*SP1*/
إنشاء إجراء DBO.GETUSERLIST
مثل
قم بضبط NOCOUNT على
يبدأ
اختر * من DBO.[معلومات المستخدم]
نهاية
يذهب
تحصل العملية المخزنة أعلاه على كافة السجلات في جدول USERINFO وتقوم بإرجاع مجموعة سجلات. رمز ASP لاستدعاء العملية المخزنة من خلال كائن COMMAND كما يلي:
'**استدعاء العملية المخزنة من خلال كائن COMMAND**
خافت مايكوم، ميرست
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
MYCOMM.COMMANDTEXT = GETUSERLIST 'حدد اسم العملية المخزنة
MYCOMM.COMMANDTYPE = 4 'يشير إلى أن هذه عملية مخزنة
MYCOMM.PREPARED = TRUE 'يتطلب تجميع أوامر SQL أولاً
تعيين MYRST = MYCOMM.EXECUTE
تعيين MYCOMM = لا شيء
يتم تعيين مجموعة السجلات التي تم الحصول عليها من خلال عملية التخزين إلى MYRST، وبعد ذلك يمكن تشغيل MYRST.
في الكود أعلاه، تشير سمة COMMANDTYPE إلى نوع الطلب، وتكون القيمة والوصف كما يلي:
يشير -1 إلى أنه لا يمكن تحديد نوع معلمة COMMANDTEXT
يشير 1 إلى أن COMMANDTEXT هو نوع أمر عام
2 يشير إلى أن المعلمة COMMANDTEXT هي اسم جدول به
4 يشير إلى أن المعلمة COMMANDTEXT هي اسم العملية المخزنة
يمكنك أيضًا استدعاء العملية المخزنة من خلال كائن CONNECTION أو كائن RECORDSET، وتكون الطرق كما يلي:
'**استدعاء العملية المخزنة من خلال كائن CONNECTION**
ديميكون، ميرست
تعيين MYCONN = SERVER.CREATEOBJECT(ADODB.CONNECTION)
MYCONN.OPEN MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
SET MYRST = MYCONN.EXECUTE(GETUSERLIST,0,4) 'المعلمة الأخيرة لها نفس معنى COMMANDTYPE
تعيين MYCONN = لا شيء
'**استدعاء العملية المخزنة من خلال كائن RECORDSET**
ديميرست
تعيين MYRST = SERVER.CREATEOBJECT(ADODB.RECORDSET)
MYRST.OPEN GETUSERLIST,MYCONSTR,0,1,4
'MYCONSTR هي سلسلة اتصال قاعدة البيانات، والمعلمة الأخيرة لها نفس معنى COMMANDTYPE
2. عملية مخزنة بدون مدخلات ومخرجات
ألق نظرة على الإجراءات المخزنة التالية:
/*SP2*/
إنشاء إجراء DBO.DELUSERALL
مثل
قم بضبط NOCOUNT على
يبدأ
حذف من DBO.[معلومات المستخدم]
نهاية
يذهب
تقوم هذه العملية المخزنة بحذف كافة السجلات الموجودة في جدول USERINFO دون أي إدخال أو إخراج. طريقة الاتصال هي في الأساس نفس الطريقة المذكورة أعلاه، باستثناء أنه ليست هناك حاجة للحصول على مجموعة السجلات:
'**استدعاء العملية المخزنة من خلال كائن COMMAND**
ديميكوم
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
MYCOMM.COMMANDTEXT = DELUSERALL 'حدد اسم العملية المخزنة
MYCOMM.COMMANDTYPE = 4 'يشير إلى أن هذه عملية مخزنة
MYCOMM.PREPARED = TRUE 'يتطلب تجميع أوامر SQL أولاً
MYCOMM.EXECUTE 'لا حاجة للحصول على السجل المعين هنا
تعيين MYCOMM = لا شيء
بالطبع، يمكن أيضًا استدعاء هذا النوع من العمليات المخزنة من خلال كائن CONNECTION أو كائن RECORDSET ومع ذلك، يتم إنشاء كائن RECORDSET للحصول على مجموعة السجلات. إذا لم يتم إرجاع مجموعة السجلات، استخدم كائن COMMAND.
3. الإجراءات المخزنة مع قيم الإرجاع
عند إجراء عمليات تشبه SP2، يجب عليك الاستفادة الكاملة من إمكانات معالجة المعاملات القوية لـ SQL SERVER للحفاظ على تناسق البيانات. علاوة على ذلك، قد نحتاج إلى تخزين حالة التنفيذ التي أرجعتها العملية، ولتحقيق هذه الغاية، قم بتعديل SP2 كما يلي:
/*SP3*/
إنشاء إجراء DBO.DELUSERALL
مثل
قم بضبط NOCOUNT على
يبدأ
ابدأ المعاملة
حذف من DBO.[معلومات المستخدم]
إذا @@ خطأ = 0
يبدأ
ارتكاب الصفقة
العودة 1
نهاية
آخر
يبدأ
معاملة التراجع
العودة 0
نهاية
يعود
نهاية
يذهب
العملية المخزنة أعلاه ترجع 1 عند تنفيذ DELETE بنجاح، وإلا فإنها ترجع 0 وتنفذ عملية التراجع. من أجل الحصول على القيمة المرجعة في ASP، تحتاج إلى استخدام مجموعة PARAMETERS لإعلان المعلمات:
'**استدعاء عملية مخزنة بقيمة الإرجاع واحصل على القيمة المرجعة**
ديم مايكوم، ميبارا
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
MYCOMM.COMMANDTEXT = DELUSERALL 'حدد اسم العملية المخزنة
MYCOMM.COMMANDTYPE = 4 'يشير إلى أن هذه عملية مخزنة
MYCOMM.PREPARED = TRUE 'يتطلب تجميع أوامر SQL أولاً
'الإعلان عن قيمة الإرجاع
تعيين MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
MYCOMM.EXECUTE
'احصل على قيمة الإرجاع
إعادة القيمة الخافتة
RETVALUE = MYCOMM(0) 'أو RETVALUE = MYCOMM.PARAMETERS(0)
تعيين MYCOMM = لا شيء
في MYCOMM.CREATEPARAMETER(RETURN,2,4)، يكون معنى كل معلمة كما يلي:
المعلمة الأولى (RETURE) هي اسم المعلمة. يمكن تعيين اسم المعلمة بشكل تعسفي، ولكن بشكل عام يجب أن يكون هو نفس اسم المعلمة المعلن في العملية المخزنة. هذه هي القيمة المرجعة، وعادةً ما أقوم بتعيينها على RETURE؛
تشير المعلمة الثانية (2) إلى نوع بيانات المعلمة، يرجى الرجوع إلى مرجع ADO للحصول على رموز الأنواع المحددة الموضحة أدناه:
أدبيجينت: 20؛
أدبيناري: 128؛
أدبولين: 11؛
أدشار: 129؛
الطابع الزمني الإضافي: 135؛
الاعتدال: 0؛
أدينجر: 3؛
أدسمالينت: 2؛
ADTINYINT: 16؛
أدفارتشار: 200؛
بالنسبة للقيمة المرجعة، يمكن أخذ القيم الصحيحة فقط، وتكون -1 إلى -99 قيمًا محجوزة؛
تشير المعلمة الثالثة (4) إلى طبيعة المعلمة، حيث تشير 4 إلى أن هذه قيمة إرجاع. وصف قيمة هذه المعلمة كما يلي:
0: لا يمكن تحديد النوع؛ 1: معلمة الإدخال؛ 2: معلمة الإدخال؛ 3: معلمة الإدخال أو الإخراج؛
يجب أن يُقال إن كود ASP المذكور أعلاه هو الكود الكامل، وهو في الواقع الكود الأكثر تعقيدًا.
تعيين MYPARA = MYCOMM.CREATEPARAMETER(RETURN,2,4)
MYCOMM.PARAMETERS.APPEND MYPARA
يمكن تبسيطها ل
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(RETURN,2,4)
ويمكن تبسيطها أكثر، كما سيتم شرحه لاحقًا.
بالنسبة للإجراءات المخزنة ذات المعلمات، لا يمكن استدعاؤها إلا باستخدام كائن COMMAND (توجد أيضًا معلومات يمكن استدعاؤها من خلال كائن CONNECTION أو كائن RECORDSET، لكنني لم أجربه).
4. العملية المخزنة مع معلمات الإدخال ومعلمات الإخراج
القيمة المرجعة هي في الواقع معلمة إخراج خاصة. في معظم الحالات، نستخدم عملية مخزنة تحتوي على معلمات الإدخال والإخراج. على سبيل المثال، نريد الحصول على اسم مستخدم بمعرف معين في جدول معلومات المستخدم. ---معرف المستخدم ومعلمة الإخراج---اسم المستخدم. العملية المخزنة التي تنفذ هذه الوظيفة هي كما يلي:
/*SP4*/
إنشاء الإجراء DBO.GETUSERNAME
@USERIDINT،
@اسم المستخدم VARCHAR(40) الإخراج
مثل
قم بضبط NOCOUNT على
يبدأ
إذا كان @USERID فارغًا
حدد @USERNAME=USERNAME
من DBO.[معلومات المستخدم]
حيث معرف المستخدم=@USERID
يعود
نهاية
يذهب
رمز ASP الذي يستدعي العملية المخزنة هو كما يلي:
'**استدعاء عملية مخزنة بمعلمات الإدخال والإخراج**
DIM MYCOMM،معرف المستخدم،اسم المستخدم
معرف المستخدم = 1
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
MYCOMM.ACTIVECONNECTION = MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
MYCOMM.COMMANDTEXT = GETUSERNAME 'حدد اسم العملية المخزنة
MYCOMM.COMMANDTYPE = 4 'يشير إلى أن هذه عملية مخزنة
MYCOMM.PREPARED = TRUE 'يتطلب تجميع أوامر SQL أولاً
"الإعلان عن المعلمات."
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERID,3,1,4,USERID)
MYCOMM.PARAMETERS.APPEND MYCOMM.CREATEPARAMETER(@USERNAME,200,2,40)
MYCOMM.EXECUTE
"احصل على المعلمات."
اسم المستخدم = MYCOMM(1)
تعيين MYCOMM = لا شيء
في الكود أعلاه، يمكنك أن ترى أنه على عكس الإعلان عن قيمة الإرجاع، هناك 5 معلمات مطلوبة عند الإعلان عن معلمات الإدخال، و4 معلمات مطلوبة عند الإعلان عن معلمات الإخراج. عند الإعلان عن معلمات الإدخال، فإن المعلمات الخمس هي: اسم المعلمة، ونوع بيانات المعلمة، ونوع المعلمة، وطول البيانات، وقيمة المعلمة. عند الإعلان عن معلمة الإخراج، لا توجد معلمة أخيرة: قيمة المعلمة.
يجب إيلاء اهتمام خاص لما يلي: عند الإعلان عن المعلمات، يجب أن يكون الترتيب هو نفسه المحدد في عملية التخزين، ويجب أيضًا أن يكون نوع البيانات وطول كل معلمة متطابقين مع تلك المحددة في عملية التخزين.
إذا كانت العملية المخزنة تحتوي على معلمات متعددة، فسيظهر رمز ASP مرهقًا، ويمكنك استخدام الأمر "TH" لتبسيط التعليمات البرمجية:
'**استدعاء عملية مخزنة بمعلمات الإدخال والإخراج (رمز مبسط)**
DIM MYCOMM،معرف المستخدم،اسم المستخدم
معرف المستخدم = 1
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
مع مايكوم
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
.COMMANDTEXT = GETUSERNAME 'حدد اسم العملية المخزنة
.COMMANDTYPE = 4 'يشير إلى أن هذه عملية مخزنة
.PREPARED = TRUE 'يتطلب تجميع أوامر SQL أولاً
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.ينفذ
نهاية مع
اسم المستخدم = MYCOMM(1)
تعيين MYCOMM = لا شيء
إذا أردنا الحصول على أسماء مستخدمين لعشرة مستخدمين بمعرفات من 1 إلى 10، فهل نحتاج إلى إنشاء كائنات COMMAND 10 مرات؟ لا. إذا كنت بحاجة إلى استدعاء نفس العملية المخزنة عدة مرات، فما عليك سوى تغيير معلمات الإدخال وستحصل على مخرجات مختلفة:
'**استدعاءات متعددة لنفس العملية المخزنة**
DIM MYCOMM،معرف المستخدم،اسم المستخدم
اسم المستخدم=
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
لمعرف المستخدم = 1 إلى 10
مع مايكوم
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
.COMMANDTEXT = GETUSERNAME 'حدد اسم العملية المخزنة
.COMMANDTYPE = 4 'يشير إلى أن هذه عملية مخزنة
.PREPARED = TRUE 'يتطلب تجميع أوامر SQL أولاً
إذا كان معرف المستخدم = 1 ثم
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.ينفذ
آخر
'إعادة تعيين القيم لمعلمات الإدخال (لا يلزم إعادة تعريف معلمات الإدخال ومعلمات الإخراج التي لا تتغير قيم معلماتها في هذا الوقت)
.PARAMETERS(@USERID) = معرف المستخدم
.ينفذ
نهاية إذا
نهاية مع
USERNAME = USERNAME + MYCOMM(1) + , 'ربما ترغب في استخدام تخزين المصفوفة
التالي
تعيين MYCOMM = لا شيء
كما يتبين من الكود أعلاه: عند استدعاء نفس العملية المخزنة بشكل متكرر، ما عليك سوى إعادة تعيين معلمات الإدخال التي تغيرت قيمها. تحتوي هذه الطريقة على معلمات إدخال وإخراج متعددة، ويتم استدعاء قيمة معلمة إدخال واحدة فقط الوقت عند حدوث تغييرات، يمكن تقليل كمية التعليمات البرمجية بشكل كبير.
5. عملية مخزنة تحتوي على قيم الإرجاع ومعلمات الإدخال ومعلمات الإخراج في نفس الوقت
كما ذكرنا سابقًا، عند استدعاء عملية مخزنة، يجب أن يكون الترتيب الذي يتم به إعلان المعلمات هو نفس الترتيب المحدد في العملية المخزنة. هناك نقطة أخرى يجب الانتباه إليها بشكل خاص: إذا كانت العملية المخزنة تحتوي على قيمة إرجاع ومعلمات إدخال وإخراج، فيجب الإعلان عن قيمة الإرجاع أولاً.
لتوضيح طريقة الاستدعاء في هذه الحالة، دعونا نحسن المثال أعلاه. لا يزال بإمكانك الحصول على اسم المستخدم الخاص بالمعرف 1، ولكن من الممكن أن المستخدم لا يملكه (تم حذف المستخدم، ويعد USERID حقلاً ذاتي التزايد). تُرجع العملية المخزنة قيمًا مختلفة اعتمادًا على ما إذا كان المستخدم يمتلكها أم لا. عند هذه النقطة، تكون العملية المخزنة ورمز ASP كما يلي:
/*SP5*/
إنشاء الإجراء DBO.GETUSERNAME
--من أجل تعميق الانطباع بالترتيب، قم بعكس ترتيب تعريف المعلمتين التاليتين.
@اسم المستخدم VARCHAR(40) الإخراج،
@USERIDINT
مثل
قم بضبط NOCOUNT على
يبدأ
إذا كان @USERID فارغًا
حدد @USERNAME=USERNAME
من DBO.[معلومات المستخدم]
حيث معرف المستخدم=@USERID
إذا @@ROWCOUNT>0
العودة 1
آخر
العودة 0
يعود
نهاية
يذهب
'**استدعاء عملية مخزنة ذات قيمة الإرجاع ومعلمات الإدخال ومعلمات الإخراج**
DIM MYCOMM،معرف المستخدم،اسم المستخدم
معرف المستخدم = 1
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
مع مايكوم
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
.COMMANDTEXT = GETUSERNAME 'حدد اسم العملية المخزنة
.COMMANDTYPE = 4 'يشير إلى أن هذه عملية مخزنة
.PREPARED = TRUE 'يتطلب تجميع أوامر SQL أولاً
'يجب الإعلان عن قيمة الإرجاع أولاً
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'يتم أيضًا عكس ترتيب الإعلان للمعلمتين التاليتين وفقًا لذلك.
.PARAMETERS.APPEND .CREATEPARAMETER(@USERNAME,200,2,40)
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.ينفذ
نهاية مع
إذا كان MYCOMM(0) = 1 إذن
اسم المستخدم = MYCOMM(1)
آخر
USERNAME = هذا المستخدم ليس لديه
نهاية إذا
تعيين MYCOMM = لا شيء
6. عملية مخزنة تقوم بإرجاع المعلمات ومجموعة السجلات في نفس الوقت
في بعض الأحيان، نحتاج إلى أن تقوم عملية التخزين بإرجاع المعلمات ومجموعات السجلات في نفس الوقت. على سبيل المثال، عند استخدام عملية التخزين للترحيل، نحتاج إلى إرجاع المعلمات مثل مجموعات السجلات وإجمالي حجم البيانات في نفس الوقت. فيما يلي عملية مخزنة للترحيل:
/*SP6*/
إنشاء إجراء DBO.GETUSERLIST
@IPAGECOUNT INT OUTPUT، - إجمالي عدد الصفحات
@IPAGE INT، - رقم الصفحة الحالية
@IPAGESIZE INT - عدد السجلات في كل صفحة
مثل
قم بضبط NOCOUNT على
يبدأ
- إنشاء جدول مؤقت
إنشاء جدول #T (معرف INT، حقل الزيادة التلقائية
معرف المستخدم الدولي،
اسم المستخدم VARCHAR(40))
- كتابة البيانات إلى جدول مؤقت
أدخل في #T
حدد معرف المستخدم، اسم المستخدم من DBO.[USERINFO]
الطلب حسب معرف المستخدم
-الحصول على العدد الإجمالي للسجلات
أعلن @IRECORDCOUNT INT
تعيين @IRECORDCOUNT = @@ROWCOUNT
-تحديد العدد الإجمالي للصفحات
إذا كان @IRECORDCOUNT%@IPAGESIZE=0
تعيين @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)
آخر
تعيين @IPAGECOUNT=CEILING(@IRECORDCOUNT/@IPAGESIZE)+1
--إذا كان رقم الصفحة المطلوبة أكبر من العدد الإجمالي للصفحات، فسيتم عرض الصفحة الأخيرة
إذا @IPAGE> @IPAGECOUNT
حدد @IPAGE = @IPAGECOUNT
-تحديد سجلات البداية والنهاية للصفحة الحالية
أعلن @ISTART INT - بدء التسجيل
أعلن @IEND INT --END السجل
حدد @ISTART = (@IPAGE - 1) * @IPAGESIZE
حدد @IEND = @ISTART + @IPAGESIZE + 1
--الحصول على سجل الصفحة الحالية
حدد * من #T حيث المعرف>@ISTART والمعرف<@IEND
--حذف الجدول المؤقت
إسقاط الجدول #T
- إرجاع العدد الإجمالي للسجلات
العودة @IRECORDCOUNT
نهاية
يذهب
في عملية التخزين المذكورة أعلاه، أدخل رقم الصفحة الحالية وعدد السجلات لكل صفحة، وقم بإرجاع مجموعة السجلات للصفحة الحالية، وإجمالي عدد الصفحات، وإجمالي عدد السجلات. لكي تكون أكثر نموذجية، يتم إرجاع العدد الإجمالي للسجلات كقيمة إرجاع. ما يلي هو رمز ASP الذي يستدعي العملية المخزنة (تم حذف عملية الترحيل المحددة):
'**عملية تخزين ترحيل المكالمات**
خافت الصفحة الآن، حجم الصفحة، عدد الصفحات، عدد السجلات
خافت مايكوم، ميرست
الصفحة الآن = الطلب (PN)
'وظيفة مخصصة تستخدم للتحقق من الأعداد الطبيعية
إذا كان التحقق من (الصفحة) = خطأ، فإن الصفحة الآن = 1
حجم الصفحة = 20
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
مع مايكوم
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
.COMMANDTEXT = GETUSERLIST 'حدد اسم العملية المخزنة
.COMMANDTYPE = 4 'يشير إلى أن هذه عملية مخزنة
.PREPARED = TRUE 'يتطلب تجميع أوامر SQL أولاً
'قيمة الإرجاع (إجمالي عدد السجلات)
.PARAMETERS.APPEND .CREATEPARAMETER(RETURN,2,4)
'معلمات الإخراج (إجمالي عدد الصفحات)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGECOUNT,3,2)
'معلمات الإدخال (رقم الصفحة الحالية)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGE,3,1,4,PAGENOW)
'معلمات الإدخال (عدد السجلات في كل صفحة)
.PARAMETERS.APPEND .CREATEPARAMETER(@IPAGESIZE,3,1,4,PAGESIZE)
تعيين MYRST = .تنفيذ
نهاية مع
إذا كانت MYRST.STATE = 0، "لم يتم الحصول على أي بيانات، فسيتم إغلاق MYRST."
عدد السجلات = -1
آخر
MYRST.CLOSE 'ملاحظة: للحصول على قيم المعلمات، تحتاج إلى إغلاق كائن مجموعة السجلات أولاً
عدد السجلات = MYCOMM(0)
عدد الصفحات = MYCOMM(1)
إذا كانت CINT(PAGENOW)>=CINT(PAGECOUNT) فإن PAGENOW=PAGECOUNT
نهاية إذا
تعيين MYCOMM = لا شيء
'"عرض السجلات أدناه."
إذا كان RECORDCOUNT = 0 ثم
الرد.الكتابة لا يوجد سجل
ELSEIF RECORDCOUNT> 0 ثم
MYRST.OPEN
افعل ذلك حتى MYRST.EOF
...
حلقة
'يعرض ما يلي معلومات الترحيل
...
آخر 'رقم السجل=-1
خطأ في معلمة RESPONSE.WRITE
نهاية إذا
فيما يتعلق بالكود أعلاه، هناك نقطة واحدة فقط تحتاج إلى شرح: عند إرجاع مجموعة السجلات والمعلمات في نفس الوقت، إذا كنت ترغب في الحصول على المعلمات، فأنت بحاجة إلى إغلاق مجموعة السجلات أولاً، ثم فتحها عند استخدام مجموعة السجلات.
7. العملية المخزنة التي تقوم بإرجاع مجموعات سجلات متعددة
تقدم هذه المقالة أولاً العملية المخزنة التي تقوم بإرجاع مجموعة سجلات. في بعض الأحيان، تحتاج العملية المخزنة إلى إرجاع مجموعات سجلات متعددة في ASP، فكيف يمكن الحصول على مجموعات السجلات هذه في نفس الوقت؟ لتوضيح هذه المشكلة، أضف حقلين إلى جدول USERINFO: USERTEL وUSERMAIL، وقم بتعيين المستخدمين الذين قاموا بتسجيل الدخول فقط الذين يمكنهم عرض هذين المحتوىين.
/*SP7*/
إنشاء إجراء DBO.GETUSERINFO
@USERIDINT،
@ التحقق من تسجيل الدخول
مثل
قم بضبط NOCOUNT على
يبدأ
إذا كان @USERID فارغًا أو @CHECKLOGIN فهو NULL RETURN
حدد اسم المستخدم
من DBO.[USRINFO]
حيث معرف المستخدم=@USERID
--إذا كنت مستخدمًا مسجل الدخول، فاستخدم USERTEL وUSERMAIL
إذا @ التحقق من تسجيل الدخول = 1
حدد المستخدم، بريد المستخدم
من DBO.[معلومات المستخدم]
حيث معرف المستخدم=@USERID
يعود
نهاية
يذهب
وفيما يلي رمز ASP:
'**استدعاء عملية مخزنة تقوم بإرجاع مجموعات سجلات متعددة**
DIM CHECKLG،USERID،USERNAME،USERTEL،USERMAIL
خافت مايكوم، ميرست
معرف المستخدم = 1
'CHECKLOGIN() هي وظيفة مخصصة لتحديد ما إذا كان الزائر قد قام بتسجيل الدخول أم لا
CHECKLG = تسجيل الدخول ()
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
مع مايكوم
.ACTIVECONNECTION = MYCONSTR 'MYCONSTR هي سلسلة اتصال قاعدة البيانات
.COMMANDTEXT = GETUSERINFO 'حدد اسم العملية المخزنة
.COMMANDTYPE = 4 'يشير إلى أن هذه عملية مخزنة
.PREPARED = TRUE 'يتطلب تجميع أوامر SQL أولاً
.PARAMETERS.APPEND .CREATEPARAMETER(@USERID,3,1,4,USERID)
.PARAMETERS.APPEND .CREATEPARAMETER(@CHECKLOGIN,11,1,1,CHECKLG)
تعيين MYRST = .تنفيذ
نهاية مع
تعيين MYCOMM = لا شيء
'احصل على القيمة من مجموعة السجلات الأولى
اسم المستخدم = MYRST(0)
'احصل على القيمة من مجموعة السجلات الثانية
إذا لم يكن الأمر كذلك فلا شيء
تعيين MYRST = MYRST.NEXTRECORDSET()
يوسيرتيل = ميرست(0)
بريد المستخدم = ميرست(1)
نهاية إذا
تعيين ميرست = لا شيء
في التعليمات البرمجية أعلاه، يتم استخدام أسلوب NEXTRECORDSET لكائن RECORDSET للحصول على مجموعات سجلات متعددة يتم إرجاعها بواسطة عملية التخزين.
حتى الآن، قدمت هذه المقالة شرحًا شاملاً نسبيًا للمواقف المختلفة التي يستدعي فيها ASP العمليات المخزنة. وأخيراً، دعونا نتحدث عن الطرق المختلفة لاستدعاء العمليات المخزنة المتعددة في برنامج ASP.
في برنامج ASP، تكون الطرق الثلاث التالية على الأقل ممكنة لاستدعاء عمليات مخزنة متعددة:
1. قم بإنشاء كائنات أمر متعددة
ديميكوم
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'استدعاء العملية المخزنة الأولى
...
تعيين MYCOMM = لا شيء
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'استدعاء العملية المخزنة الثانية
...
تعيين MYCOMM = لا شيء
...
2. قم بإنشاء كائن COMMAND واحد فقط وقم بمسح معلماته عند إنهاء المكالمة.
ديميكوم
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'استدعاء العملية المخزنة الأولى
.....
'مسح المعلمات (بافتراض وجود ثلاث معلمات)
MYCOMM.PARAMETERS.DELETE 2
MYCOMM.PARAMETERS.DELETE 1
MYCOMM.المعلمات.حذف 0
'استدعاء العملية المخزنة الثانية ومسح المعلمات
...
تعيين MYCOMM = لا شيء
في الوقت الحالي، يرجى ملاحظة: ترتيب مسح المعلمات يتعارض مع ترتيب إعلان المعلمة، ولا أعرف السبب.
3. استخدم أسلوب REFRESH لمجموعة بيانات PARAMETERS لإعادة تعيين كائن PARAMETER
ديميكوم
تعيين MYCOMM = SERVER.CREATEOBJECT(ADODB.COMMAND)
'استدعاء العملية المخزنة الأولى
.....
'إعادة تعيين كافة كائنات PARAMETER الموجودة في مجموعة بيانات PARAMETERS
MYCOMM.PARAMETERS.REFRESH
'استدعاء العملية المخزنة الثانية
.....
تعيين MYCOMM = لا شيء
من المعتقد عمومًا أن إنشاء الكائنات بشكل متكرر هو أسلوب أقل كفاءة، ولكن بعد الاختبار (أداة الاختبار هي MICROSOFT APPLICATION CENTER TEST)، تكون النتائج غير متوقعة:
الطريقة 2 >= الطريقة 1 >> الطريقة 3
سرعة تشغيل الطريقة 2 أكبر من أو تساوي الطريقة 1 (أعلى بحوالي 4٪). سرعة تشغيل هاتين الطريقتين أسرع بكثير من الطريقة 3 (حتى 130٪). لذلك يوصى باستخدامها الطريقة الأولى عندما يكون هناك العديد من المعلمات، إذا لم يكن الأمر كذلك، استخدم الطريقة الثانية.
لقد استغرق الأمر مني يومًا حتى أكتب أخيرًا بعضًا من تجربتي السطحية في استدعاء الإجراءات المخزنة في ASP. ومنها، بعضها أعرف فقط التأثيرات وليس الأسباب، وبعضها قد يكون مخطئًا، لكن هذا كله من خلال ممارستي الشخصية. أرجو أن تتقبلوها نقدًا أيها القراء. إذا كان لديك أي آراء مختلفة، واسمحوا لي أن أعرف شكرا مقدما.