هناك العديد من المقالات حول 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]
نهاية
المخزن
جميع السجلات الموجودة في جدول معلومات المستخدم دون أي إدخال أو إخراج. طريقة الاتصال هي في الأساس نفس الطريقة المذكورة أعلاه، باستثناء أنه ليست هناك حاجة للحصول على مجموعة السجلات:
'**استدعاء الإجراء المخزن من خلال الأمر. هدف**
خافت 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؛
بالنسبة للقيمة المرجعة، يمكن أخذ القيم الصحيحة فقط، وتكون القيم المحجوزة من -1 إلى -99؛
تشير المعلمة الثالثة (4) إلى طبيعة المعلمة، حيث تشير 4 إلى أن هذه قيمة إرجاع. وصف قيمة هذه المعلمة كما يلي:
0: لا يمكن تحديد النوع؛ 1: معلمات الإدخال؛ 2: معلمات الإدخال أو الإخراج؛ 4: قيمة الإرجاع
يجب أن يُقال إن رمز ASP المذكور أعلاه هو رمز كامل، أي الكود الأكثر تعقيدًا في الحقيقة،
Set 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")
with MyComm
.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)
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")
باستخدام MyComm
.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
يعود
نهاية
يلي
هو رمز ASP:
'**استدعاء إجراء مخزن يقوم بإرجاع مجموعات سجلات متعددة**
DIM checklg، معرف المستخدم، اسم المستخدم، UserTel، UserMail
DIM MyComm، MyRst
معرف المستخدم = 1
'checklogin () هي وظيفة مخصصة لتحديد ما إذا كان الزائر قد قام بتسجيل الدخول أم لا
checklg = checklogin()
تعيين MyComm = Server.CreateObject("ADODB.Command")
with MyComm
.ActiveConnection = MyConStr 'MyConStr هي سلسلة اتصال قاعدة البيانات
.CommandText = "getUserList" 'حدد اسم الإجراء المخزن
.CommandType = 4 'يشير إلى أن هذا إجراء مخزن
.Prepared = true 'يتطلب تجميع أوامر SQL أولاً
.Parameters.append .CreateParameter("@userid"،3,1,4,UserID)
.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. قم فقط بإنشاء كائن أمر، وعند إنهاء المكالمة، قم بمسح المعلمة الخاصة به
DIM MyComm
تعيين MyComm = Server.CreateObject("ADODB.Command")
'استدعاء الإجراء المخزن الأول
.....
'مسح المعلمات (بافتراض وجود ثلاث معلمات)
MyComm.Parameters.delete 2
MyComm.Parameters.delete 1
MyComm.Parameters.delete 0
'استدعاء الإجراء المخزن الثاني ومسح المعلمات
...
Set MyComm = لا شيء
في الوقت الحالي، يرجى ملاحظة: ترتيب مسح المعلمات هو عكس ترتيب إعلان المعلمة، ولا أعرف السبب.
3. استخدم أسلوب التحديث الخاص بمجموعة بيانات المعلمات لإعادة تعيين كائن المعلمة
DIM MyComm
تعيين MyComm = Server.CreateObject("ADODB.Command")
'استدعاء الإجراء المخزن الأول
.....
'إعادة تعيين كافة كائنات المعلمات الموجودة في مجموعة بيانات المعلمات
MyComm.Parameters.Refresh
'استدعاء الإجراء المخزن الثاني
.....
Set MyComm = لا شيء
من المعتقد عمومًا أن إنشاء الكائنات بشكل متكرر هو أسلوب أقل كفاءة، ولكن بعد الاختبار (أداة الاختبار هي Microsoft Application Center Test)، تكون النتائج غير متوقعة:
الطريقة 2 >= الطريقة 1 >> الطريقة 3
سرعة تشغيل الطريقة 2 أكبر من أو تساوي الطريقة 1 (أعلى بحوالي 4٪). سرعة تشغيل هاتين الطريقتين أسرع بكثير من الطريقة 3 (حتى 130٪). لذلك يوصى باستخدامها الطريقة الأولى عندما يكون هناك العديد من المعلمات، إذا لم يكن الأمر كذلك، استخدم الطريقة الثانية.
لقد استغرق الأمر مني يومًا حتى أكتب أخيرًا بعضًا من تجربتي السطحية في استدعاء الإجراءات المخزنة في ASP. ومنها، بعضها أعرف فقط التأثيرات وليس الأسباب، وبعضها قد يكون مخطئًا، لكن هذا كله من خلال ممارستي الشخصية. أرجو أن تتقبلوها نقدًا أيها القراء. إذا كان لديك أي آراء مختلفة، واسمحوا لي أن أعرف شكرا مقدما.