شرح تفصيلي لتطبيق الإجراء المخزن في تطوير ASP |. الاتصال، المعلمة، التخزين، قاعدة البيانات، الإخراج، التجميع، mycomm، الإدخال، معرف المستخدم، الكود. هناك العديد من المقالات حول ASP والإجراءات المخزنة (الإجراءات المخزنة)، لكنني أشك في ما إذا كان المؤلفون قد فعلوا ذلك. مارسته فعلا. عندما كنت مبتدئًا، راجعت الكثير من المعلومات ذات الصلة ووجدت أن العديد من الأساليب المقدمة لم تكن هي نفسها في الممارسة العملية. بالنسبة للتطبيقات البسيطة، قد تكون هذه المواد مفيدة، لكنها تقتصر على ذلك، لأنها في الأساس متشابهة وتنسخ بعضها البعض، أما بالنسبة للتطبيقات الأكثر تعقيدًا قليلاً، فكلها غير واضحة.
الآن، يمكنني الوصول بشكل أساسي إلى SQL Server عن طريق استدعاء الإجراءات المخزنة. النص التالي هو ملخص للممارسة.
الإجراء المخزن هو أمر SQL واحد أو أكثر مخزن في قاعدة البيانات ككائنات قابلة للتنفيذ.
التعريفات دائما مجردة. الإجراء المخزن هو في الواقع مجموعة من عبارات SQL التي يمكنها إكمال عمليات معينة، ولكن يتم وضع هذه المجموعة من العبارات في قاعدة البيانات (هنا نتحدث فقط عن SQL Server). إذا قمنا بإنشاء إجراءات مخزنة واستدعاء الإجراءات المخزنة في ASP، فيمكننا تجنب خلط عبارات SQL مع كود ASP. هناك ثلاث فوائد على الأقل للقيام بذلك:
أولاً، أنه يحسن الكفاءة بشكل كبير. سرعة تنفيذ الإجراء المخزن نفسه سريعة جدًا، ويمكن أن يؤدي استدعاء الإجراء المخزن إلى تقليل عدد التفاعلات مع قاعدة البيانات بشكل كبير.
ثانيا، تحسين السلامة. إذا قمت بخلط عبارات SQL في تعليمات برمجية ASP، فبمجرد اختراق التعليمات البرمجية، فهذا يعني أيضًا تعرض بنية المكتبة للاختراق.
ثالثًا، يساعد على إعادة استخدام عبارات SQL.
في ASP، يتم استدعاء الإجراءات المخزنة بشكل عام من خلال كائن الأمر، اعتمادًا على الموقف، تقدم هذه المقالة أيضًا طرق استدعاء أخرى. لتسهيل الشرح، تم إجراء التصنيف البسيط التالي استنادًا إلى مدخلات ومخرجات الإجراء المخزن:
1. الإجراء المخزن الذي يقوم بإرجاع مجموعة سجلات واحدة فقط
يفترض الإجراء المخزن التالي (الغرض من هذه المقالة ليس وصف بناء جملة T-SQL، وبالتالي فإن الإجراء المخزن يعطي الكود فقط، دون أي تفسير):
/*SP1*/
إنشاء الإجراء dbo.getUserList
مثل
تعيين nocount على
يبدأ
حدد * من dbo.[userinfo]
نهاية
الخاص بـ go
على كافة السجلات الموجودة في جدول معلومات المستخدم ويعيد مجموعة السجلات. رمز ASP لاستدعاء الإجراء المخزن من خلال كائن الأمر كما يلي:
'**استدعاء الإجراء المخزن من خلال كائن الأمر**
DIM MyComm، MyRst
تعيين MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr هي سلسلة اتصال قاعدة البيانات
MyComm.CommandText = "getUserList" 'حدد اسم الإجراء المخزن
MyComm.CommandType = 4 'يشير إلى أن هذا إجراء مخزن
MyComm.Prepared = true 'يتطلب تجميع أوامر SQL أولاً
قم بتعيين MyRst = MyComm.Execute
Set MyComm = لا شيء
يتم تعيين مجموعة السجلات التي تم الحصول عليها بواسطة الإجراء المخزن إلى MyRst، وبعد ذلك، يمكن تشغيل MyRst.
في التعليمات البرمجية أعلاه، تشير سمة CommandType إلى نوع الطلب، والقيمة والوصف كما يلي:
-1 يشير إلى أنه لا يمكن تحديد نوع معلمة CommandText 1 يشير إلى أن معلمة CommandText هي نوع أمر عام يشير 2 إلى أن
معلمة CommandText هي اسم جدول موجود 4 يشير إلى أن معلمة CommandText هييمكن أيضًا استخدام
اسم الإجراء المخزن
لاستدعاء الإجراء المخزن من خلال كائن الاتصال أو كائن مجموعة السجلات، والطرق هي كما يلي:
'**استدعاء الإجراء المخزن من خلال كائن الاتصال**
DIM MyConn، MyRst
تعيين MyConn = Server.CreateObject("ADODB.Connection")
MyConn.open MyConStr 'MyConStr هي سلسلة اتصال قاعدة البيانات
Set MyRst = MyConn.Execute("getUserList",0,4) 'المعلمة الأخيرة لها نفس معنى CommandType
Set MyConn = Nothing
'**استدعاء الإجراء المخزن من خلال كائن Recordset**
ديم مايرست
تعيين MyRst = Server.CreateObject("ADODB.Recordset")
MyRst.open "getUserList"،MyConStr,0,1,4
'MyConStr عبارة عن سلسلة اتصال بقاعدة بيانات، والمعلمة الأخيرة لها نفس معنى CommandType
2. بالنسبة للإجراءات المخزنة بدون الإدخال والإخراج،
يرجى الاطلاع على الإجراءات المخزنة التالية:
/*SP2*/
إنشاء إجراء dbo.delUserAll
مثل
تعيين nocount على
يبدأ
حذف من dbo.[userinfo]
نهاية
go
store جميع السجلات الموجودة في جدول معلومات المستخدم دون أي إدخال أو إخراج. طريقة الاتصال هي في الأساس نفس الطريقة المذكورة أعلاه، باستثناء أنه ليست هناك حاجة للحصول على مجموعة السجلات:
'**استدعاء الإجراء المخزن من خلال كائن الأمر**
خافت MyComm
تعيين MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr هي سلسلة اتصال قاعدة البيانات
MyComm.CommandText = "delUserAll" 'حدد اسم الإجراء المخزن
MyComm.CommandType = 4 'يشير إلى أن هذا إجراء مخزن
MyComm.Prepared = true 'يتطلب تجميع أوامر SQL أولاً
MyComm.Execute 'لا حاجة للحصول على السجل المعين هنا
Set MyComm = لا شيء
بالطبع، يمكن أيضًا استدعاء هذه الإجراءات المخزنة من خلال كائن الاتصال أو كائن Recordset، ولكن يتم إنشاء كائن Recordset للحصول على مجموعة السجلات. إذا لم يتم إرجاع مجموعة السجلات، فمن الأفضل استخدام كائن Command.
3.عند إجراء عمليات مشابهة لحزمة الخدمة SP2،
يجب أن تستفيدالإجراءات المخزنة ذات قيم الإرجاع
بشكل كامل من إمكانات معالجة المعاملات القوية لـ SQL Server للحفاظ على تناسق البيانات.علاوة على ذلك، قد نحتاج إلى الإجراء المخزن لإرجاع حالة التنفيذ لهذه الغاية، قم بتعديل SP2 كما يلي:
/*SP3*/
إنشاء إجراء dbo.delUserAll
مثل
تعيين nocount على
يبدأ
ابدأ المعاملة
حذف من dbo.[userinfo]
إذا @@ خطأ = 0
يبدأ
إتمام الصفقة
العودة 1
نهاية
آخر
يبدأ
معاملة التراجع
العودة 0
نهاية
يعود
نهاية
go
يُرجع 1 عند تنفيذ الحذف بنجاح، وإلا فإنه يُرجع 0 وينفذ عملية التراجع. للحصول على القيمة المرجعة في ASP، تحتاج إلى استخدام مجموعة المعلمات لإعلان المعلمات:
'**استدعاء إجراء مخزن بقيمة الإرجاع واحصل على القيمة المرجعة**
DIM MyComm، MyPara
تعيين 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؛
adSmallInt: 2;
أدتينينت: 16؛
adVarChar: 200؛
بالنسبة لقيمة الإرجاع، يمكن استخدام الأعداد الصحيحة فقط،
وتشير المعلمة الثالثة (4) إلى طبيعة المعلمة، حيث تشير 4 إلى أن هذه قيمة إرجاع. وصف قيمة هذه المعلمة كما يلي:
0: لا يمكن تحديد النوع؛ 1: معلمة الإدخال؛ 3: معلمة الإدخال أو الإخراج؛ 4:
يجب إرجاع رمز ASP المذكور أعلاه يكون رمزًا كاملاً، وهو أيضًا الكود الأكثر تعقيدًا في الواقع
تعيين Mypara = MyComm.CreateParameter("RETURN"،2,4)
يمكن تبسيط
MyComm.Parameters.Append MyPara
إلى
MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)
يمكن الاستمرار في تبسيطه، وهو ما سيتم شرحه لاحقًا.
بالنسبة للإجراءات المخزنة ذات المعلمات، لا يمكن استدعاؤها إلا باستخدام كائن الأمر (هناك أيضًا معلومات يمكن استدعاؤها من خلال كائن الاتصال أو كائن مجموعة السجلات، لكنني لم أجربه).
4. القيمة المرجعة للإجراء المخزن مع معلمات الإدخال ومعلمات الإخراج
هي في الواقع معلمة إخراج خاصة. في معظم الحالات، نستخدم الإجراءات المخزنة التي تحتوي على معلمات الإدخال والإخراج. على سبيل المثال، نريد الحصول على اسم مستخدم بمعرف معين في جدول معلومات المستخدم. --معرف المستخدم، ومعلمة الإخراج----اسم المستخدم. الإجراء المخزن لتنفيذ هذه الوظيفة هو كما يلي:
/*SP4*/
إنشاء الإجراء dbo.getUserName
@معرف المستخدم،
إخراج @UserName varchar(40).
مثل
تعيين nocount على
يبدأ
إذا كان @UserID فارغًا
حدد @UserName=اسم المستخدم
من dbo.[معلومات المستخدم]
حيث معرف المستخدم=@UserID
يعود
نهاية
للانتقال
لاستدعاء الإجراء المخزن هو كما يلي:
'**استدعاء إجراء مخزن بمعلمات الإدخال والإخراج**
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)
Set MyComm = Nothing
في الكود أعلاه، يمكنك أن ترى أنه على عكس الإعلان عن قيمة الإرجاع، هناك 5 معلمات مطلوبة عند الإعلان عن معلمات الإدخال، و4 معلمات مطلوبة عند الإعلان عن معلمات الإخراج. عند الإعلان عن معلمات الإدخال، فإن المعلمات الخمس هي: اسم المعلمة، ونوع بيانات المعلمة، ونوع المعلمة، وطول البيانات، وقيمة المعلمة. عند الإعلان عن معلمة الإخراج، لا توجد معلمة أخيرة: قيمة المعلمة.
يجب إيلاء اهتمام خاص لما يلي: عند الإعلان عن المعلمات، يجب أن يكون الترتيب هو نفسه المحدد في الإجراء المخزن، كما يجب أن يكون نوع البيانات وطول كل معلمة متطابقين أيضًا مع تلك المحددة في الإجراء المخزن.
إذا كان الإجراء المخزن يحتوي على معلمات متعددة، فسوف يصبح رمز ASP مرهقًا، ويمكنك استخدام الأمر with لتبسيط التعليمات البرمجية:
'**استدعاء إجراء مخزن بمعلمات الإدخال والإخراج (رمز مبسط)**
DIM MyComm، معرف المستخدم، اسم المستخدم
معرف المستخدم = 1
تعيين MyComm = Server.CreateObject("ADODB.Command")
withMyComm
.ActiveConnection = MyConStr 'MyConStr هو سلسلة اتصال قاعدة البيانات.CommandText = "getUserName" 'حدد اسم الإجراء المخزن.CommandType = 4' يشير إلى أن هذا إجراء مخزن.Prepared = true 'يتطلب تجميع أمر SQL أولاً.المعلمات .إلحاق .CreateParameter ("@UserID"،3،1،4،معرف المستخدم)
.Parameters.append .CreateParameter("@UserName"،200,2,40)
.ينفذ
تنتهي ب
اسم المستخدم = MyComm(1)
Set MyComm = لا شيء
إذا أردنا الحصول على أسماء مستخدمين لـ 10 مستخدمين بمعرفات من 1 إلى 10، فهل نحتاج إلى إنشاء كائن الأمر 10 مرات؟ لا. إذا كنت بحاجة إلى استدعاء نفس الإجراء المخزن عدة مرات، فما عليك سوى تغيير معلمات الإدخال وستحصل على مخرجات مختلفة:
'**استدعاء نفس الإجراء المخزن عدة مرات**
DIM MyComm، معرف المستخدم، اسم المستخدم
اسم المستخدم = ""
تعيين MyComm = Server.CreateObject("ADODB.Command")
لمعرف المستخدم = 1 إلى 10
withMyComm
.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) + "،" "ربما ترغب في استخدام تخزين المصفوفة."
التالي
Set MyComm = لا شيء
كما يتبين من الكود أعلاه: عند استدعاء نفس الإجراء المخزن بشكل متكرر، ما عليك سوى إعادة تعيين معلمات الإدخال التي تغيرت قيمها. تحتوي هذه الطريقة على معلمات إدخال وإخراج متعددة، ويتم استدعاء واحدة فقط يمكن تقليل كمية التعليمات البرمجية بشكل كبير في كل مرة عندما تتغير قيمة معلمة الإدخال.
5. الإجراءات المخزنة التي تحتوي على قيم إرجاع ومعلمات إدخال ومعلمات إخراج في نفس الوقت، كما
ذكرنا سابقًا، عند استدعاء إجراء مخزن، يجب أن يكون الترتيب الذي يتم به الإعلان عن المعلمات هو نفس الترتيب المحدد في الإجراء المخزن. . هناك نقطة أخرى يجب الانتباه إليها بشكل خاص: إذا كان الإجراء المخزن يحتوي على قيمة إرجاع ومعلمات إدخال وإخراج، فيجب الإعلان عن قيمة الإرجاع أولاً.
لتوضيح طريقة الاستدعاء في هذه الحالة، دعونا نحسن المثال أعلاه. لا يزال بإمكانك الحصول على اسم المستخدم للمستخدم ذو المعرف 1، ولكن من المحتمل أن المستخدم غير موجود (تم حذف المستخدم، ومعرف المستخدم هو حقل ذاتي الزيادة). يقوم الإجراء المخزن بإرجاع قيم مختلفة اعتمادًا على ما إذا كان المستخدم موجودًا أم لا. عند هذه النقطة، يكون الإجراء المخزن ورمز ASP كما يلي:
/*SP5*/
إنشاء الإجراء dbo.getUserName
--من أجل تعميق انطباع "النظام"، قم بعكس ترتيب تعريف المعلمتين التاليتين.
إخراج @UserName varchar(40) ،
@معرف المستخدم int
مثل
تعيين nocount على
يبدأ
إذا كان @UserID فارغًا
حدد @UserName=اسم المستخدم
من dbo.[معلومات المستخدم]
حيث معرف المستخدم=@UserID
إذا @@rowcount>0
العودة 1
آخر
العودة 0
يعود
نهاية
اذهب
'**استدعاء إجراء مخزن بقيمة الإرجاع ومعلمات الإدخال ومعلمات الإخراج**
DIM MyComm، معرف المستخدم، اسم المستخدم
معرف المستخدم = 1
تعيين MyComm = Server.CreateObject("ADODB.Command")
withMyComm
.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)
آخر
اسم المستخدم = "هذا المستخدم غير موجود"
نهاية إذا
Set MyComm = Nothing
6. الإجراءات المخزنة التي تُرجع المعلمات ومجموعات السجلات في نفس الوقت،
نحتاج في بعض الأحيان إلى إجراءات مخزنة لإرجاع المعلمات ومجموعات السجلات في نفس الوقت. على سبيل المثال، عند استخدام الإجراءات المخزنة للترحيل، نحتاج إلى إرجاع المعلمات مثل كمجموعات السجلات والبيانات الإجمالية في نفس الوقت. ما يلي هو الإجراء المخزن للترحيل:
/*SP6*/
إنشاء الإجراء dbo.getUserList
@iPageCount int OUTPUT، - إجمالي عدد الصفحات
@iPage int، - رقم الصفحة الحالية
@iPageSize int - عدد السجلات في كل صفحة
مثل
تعيين nocount على
يبدأ
- إنشاء جدول مؤقت
إنشاء جدول #t (ID int IDENTITY، --auto-increment field
معرف المستخدم int,
اسم المستخدم فارشار (40))
- كتابة البيانات إلى جدول مؤقت
أدخل في #t
حدد معرف المستخدم، اسم المستخدم من dbo.[معلومات المستخدم]
الترتيب حسب معرف المستخدم
- احصل على العدد الإجمالي للسجلات
أعلن @iRecordCount int
اضبط @iRecordCount = @@rowcount
- حدد العدد الإجمالي للصفحات
إذا @iRecordCount%@iPageSize=0
تعيين @iPageCount=CEILING(@iRecordCount/@iPageSize)
آخر
SET @iPageCount=CEILING(@iRecordCount/@iPageSize)+1
--إذا كان رقم الصفحة المطلوبة أكبر من العدد الإجمالي للصفحات، فسيتم عرض الصفحة الأخيرة
إذا @iPage > @iPageCount
SELECT @iPage = @iPageCount
- تحديد بداية ونهاية الصفحة الحالية
أعلن @iStart int --بدء التسجيل
أعلن @iEnd int --end السجل
حدد @iStart = (@iPage - 1) * @iPageSize
SELECT @iEnd = @iStart + @iPageSize + 1
- احصل على سجل الصفحة الحالية
حدد * من #t حيث المعرف>@iStart والمعرف<@iEnd
- حذف الجدول المؤقت
DROP TABLE #t
--يرجع العدد الإجمالي للسجلات
العودة @iRecordCount
نهاية
في الإجراء المخزن أعلاه،
انتقل
إلى إدخال رقم الصفحة الحالية وعدد السجلات لكل صفحة، وإرجاع مجموعة السجلات للصفحة الحالية، وإجمالي عدد الصفحات، وإجمالي عدد السجلات.لكي تكون أكثر نموذجية، يتم إرجاع العدد الإجمالي للسجلات كقيمة إرجاع. ما يلي هو رمز ASP الذي يستدعي الإجراء المخزن (يتم حذف عملية الترحيل المحددة):
'**إجراء تخزين ترحيل المكالمات**
DIM pagenow، حجم الصفحة، عدد الصفحات، عدد السجلات
DIM MyComm، MyRst
صفحتنا = طلب("pn")
'وظيفة مخصصة تستخدم للتحقق من الأعداد الطبيعية
إذا كان CheckNar(pagenow) = false، فإن pagenow = 1
حجم الصفحة = 20
تعيين MyComm = Server.CreateObject("ADODB.Command")
withMyComm
.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)
SetMyRst = .تنفيذ
تنتهي ب
إذا كانت MyRst.state = 0، فحينئذٍ "لم يتم الحصول على أي بيانات، وسيتم إغلاق MyRst."
عدد السجلات = -1
آخر
MyRst.Close 'ملاحظة: للحصول على قيم المعلمات، تحتاج إلى إغلاق كائن مجموعة السجلات أولاً
عدد السجلات = MyComm(0)
عدد الصفحات = MyComm(1)
إذا كان cint(pagenow)>=cint(pagecount) ثم pagenow=pagecount
نهاية إذا
Set MyComm = لا شيء
'عرض السجلات أدناه
إذا كان عدد السجلات = 0 ثم
الرد.اكتب "لا يوجد سجل"
elseif عدد السجلات> 0 ثم
MyRst.open
افعل حتى MyRst.EOF
...
حلقة
'يعرض ما يلي معلومات الترحيل
...
آخر "عدد السجلات = -1."
الاستجابة.اكتب "خطأ في المعلمة"
end if
فيما يتعلق بالكود أعلاه، هناك نقطة واحدة فقط تحتاج إلى شرح: عند إرجاع مجموعة السجلات والمعلمات في نفس الوقت، إذا كنت ترغب في الحصول على المعلمات، فأنت بحاجة إلى إغلاق مجموعة السجلات أولاً، ثم فتحها عندما باستخدام مجموعة السجلات.
7. الإجراءات المخزنة التي تقوم بإرجاع مجموعات سجلات متعددة
أول ما تقدمه هذه المقالة هو الإجراءات المخزنة التي تقوم بإرجاع مجموعات السجلات. في بعض الأحيان، يلزم إجراء مخزن لإرجاع مجموعات سجلات متعددة في ASP، فكيف يمكن الحصول على مجموعات السجلات هذه في نفس الوقت؟ لتوضيح هذه المشكلة، قم بإضافة حقلين إلى جدول معلومات المستخدم: usertel وusermail، وقم بتعيين بحيث يمكن للمستخدمين الذين قاموا بتسجيل الدخول فقط عرض هذين المحتوىين.
/*SP7*/
إنشاء الإجراء dbo.getUserInfo
@معرف المستخدم int،
@ بت التحقق من تسجيل الدخول
مثل
تعيين nocount على
يبدأ
إذا كان @userid فارغًا أو @checklogin فارغًا، فسيتم إرجاعه
حدد اسم المستخدم
من dbo.[usrinfo]
حيث معرف المستخدم=@userid
--إذا كنت مستخدمًا مسجلاً الدخول، فاستخدم usertel وusermail
إذا @checklogin=1
حدد usertel، بريد المستخدم
من dbo.[معلومات المستخدم]
حيث معرف المستخدم=@userid
يعود
نهاية
go
فيما يلي رمز ASP:
'**استدعاء إجراء مخزن يقوم بإرجاع مجموعات سجلات متعددة**
DIM checklg، معرف المستخدم، اسم المستخدم، UserTel، UserMail
DIM MyComm، MyRst
معرف المستخدم = 1
'checklogin () هي وظيفة مخصصة لتحديد ما إذا كان الزائر قد قام بتسجيل الدخول أم لا
checklg = checklogin()
تعيين MyComm = Server.CreateObject("ADODB.Command")
withMyComm
.ActiveConnection = MyConStr 'MyConStr هو سلسلة اتصال قاعدة البيانات.CommandText = "getUserInfo" 'حدد اسم الإجراء المخزن.CommandType = 4' يشير إلى أن هذا إجراء مخزن.Prepared = true 'يتطلب تجميع أمر SQL أولاً.المعلمات .إلحاق .CreateParameter ("@userid"،3،1،4،معرف المستخدم)
.Parameters.append .CreateParameter("@checklogin",11,1,1,checklg)
SetMyRst = .تنفيذ
تنتهي ب
Set MyComm = Nothing
'احصل على القيمة من مجموعة السجلات الأولى
اسم المستخدم = MyRst(0)
'احصل على القيمة من مجموعة السجلات الثانية
إذا لم يكن MyRst هو لا شيء إذن
تعيين MyRst = MyRst.NextRecordset()
UserTel = MyRst(0)
بريد المستخدم = MyRst(1)
نهاية إذا
Set MyRst = Nothing
في التعليمات البرمجية أعلاه، يتم استخدام أسلوب NextRecordset لكائن Recordset للحصول على مجموعات سجلات متعددة يتم إرجاعها بواسطة الإجراء المخزن.
حتى الآن، قدمت هذه المقالة شرحًا شاملاً نسبيًا للمواقف المختلفة التي يستدعي فيها ASP الإجراءات المخزنة. وأخيراً، فلنتحدث عن الطرق المختلفة لاستدعاء إجراءات مخزنة متعددة في برنامج ASP.
في برنامج ASP، يمكن استخدام الطرق الثلاث التالية على الأقل لاستدعاء إجراءات مخزنة متعددة:
1. إنشاء كائنات أوامر متعددة
خافت MyComm
تعيين MyComm = Server.CreateObject("ADODB.Command")
'استدعاء الإجراء المخزن الأول
...
تعيين MyComm = لا شيء
تعيين MyComm = Server.CreateObject("ADODB.Command")
'استدعاء الإجراء المخزن الثاني
...
تعيين MyComm = لا شيء
......
2. قم بإنشاء كائن أمر فقط، وقم بمسح معلماته عند إنهاء المكالمة.
خافت MyComm
تعيين MyComm = Server.CreateObject("ADODB.Command")
'استدعاء الإجراء المخزن الأول
.....
'مسح المعلمات (بافتراض وجود ثلاث معلمات)
MyComm.Parameters.delete 2
MyComm.Parameters.delete 1
MyComm.Parameters.delete 0
'استدعاء الإجراء المخزن الثاني ومسح المعلمات
...
Set MyComm = لا شيء
في الوقت الحالي، يرجى ملاحظة: ترتيب مسح المعلمات هو عكس ترتيب إعلان المعلمة، ولا أعرف السبب.
3. استخدم أسلوب التحديث الخاص بمجموعة بيانات المعلمات لإعادة تعيين كائن المعلمة
خافت MyComm
تعيين MyComm = Server.CreateObject("ADODB.Command")
'استدعاء الإجراء المخزن الأول
.....
'إعادة تعيين كافة كائنات المعلمات الموجودة في مجموعة بيانات المعلمات
MyComm.Parameters.Refresh
'استدعاء الإجراء المخزن الثاني
.....
Set MyComm = لا شيء
من المعتقد عمومًا أن إنشاء الكائنات بشكل متكرر هو طريقة أقل كفاءة، ولكن بعد الاختبار (أداة الاختبار هي اختبار مركز تطبيقات Microsoft)، تكون النتائج غير متوقعة:
الطريقة 2 >= الطريقة 1 >> الطريقة 3
سرعة التشغيل الطريقة 2 أكبر من أو تساوي الطريقة 1 (أعلى بنسبة تصل إلى 4٪ تقريبًا)، تكون سرعة تشغيل هاتين الطريقتين أسرع بكثير من الطريقة 3 (حتى 130٪)، لذلك يوصى باستخدام الطريقة 1 عندما يكون هناك العديد من المعلمات، واستخدم الطريقة 1 عندما يكون هناك عدد قليل من المعلمات 2.