هناك العديد من المقالات حول ASP والإجراءات المخزنة (الإجراءات المخزنة)، لكنني أشك في ما إذا كان المؤلفون قد مارسوها بالفعل. عندما كنت مبتدئًا، راجعت الكثير من المعلومات ذات الصلة ووجدت أن العديد من الأساليب المقدمة لم تكن هي نفسها في الممارسة العملية. بالنسبة للتطبيقات البسيطة، قد تكون هذه المواد مفيدة، لكنها تقتصر على ذلك، لأنها في الأساس متشابهة وتنسخ بعضها البعض، أما بالنسبة للتطبيقات الأكثر تعقيدًا قليلاً، فكلها غير واضحة.
الآن، يمكنني الوصول بشكل أساسي إلى SQL Server عن طريق استدعاء الإجراءات المخزنة. النص التالي هو ملخص للممارسة.
الإجراء المخزن هو أمر SQL واحد أو أكثر مخزن في قاعدة البيانات ككائنات قابلة للتنفيذ.
التعريفات دائما مجردة. الإجراء المخزن هو في الواقع مجموعة من عبارات SQL التي يمكنها إكمال عمليات معينة، ولكن يتم وضع هذه المجموعة من العبارات في قاعدة البيانات (هنا نتحدث فقط عن SQL Server). إذا قمنا بإنشاء إجراءات مخزنة واستدعاء الإجراءات المخزنة في ASP، فيمكننا تجنب خلط عبارات SQL مع كود ASP. هناك ثلاث فوائد على الأقل للقيام بذلك:
أولاً، أنه يحسن الكفاءة بشكل كبير. سرعة تنفيذ الإجراء المخزن نفسه سريعة جدًا، ويمكن أن يؤدي استدعاء الإجراء المخزن إلى تقليل عدد التفاعلات مع قاعدة البيانات بشكل كبير.
ثانيا، تحسين السلامة. إذا قمت بخلط عبارات SQL في تعليمات برمجية ASP، فبمجرد اختراق التعليمات البرمجية، فهذا يعني أيضًا تعرض بنية المكتبة للاختراق.
ثالثًا، يساعد على إعادة استخدام عبارات SQL.
في ASP، يتم استدعاء الإجراءات المخزنة بشكل عام من خلال كائن الأمر، اعتمادًا على الموقف، تقدم هذه المقالة أيضًا طرق استدعاء أخرى. لتسهيل الشرح، تم إجراء التصنيف البسيط التالي استنادًا إلى مدخلات ومخرجات الإجراء المخزن:
1. الإجراء المخزن الذي يقوم بإرجاع مجموعة سجلات واحدة فقط
يفترض الإجراء المخزن التالي (الغرض من هذه المقالة ليس وصف بناء جملة T-SQL، وبالتالي فإن الإجراء المخزن يعطي الكود فقط، بدون تفسير):
/*SP1*/
إنشاء إجراء dbo.getUserList
كمجموعة nocount عند
البدء
،
حدد * من dbo.[userinfo]
end
go
الإجراء المخزن أعلاه يحصل على كافة السجلات في جدول معلومات المستخدم وإرجاع مجموعة السجلات. رمز ASP لاستدعاء الإجراء المخزن من خلال كائن الأمر كما يلي:
'**استدعاء الإجراء المخزن من خلال كائن الأمر**
DIM MyComm,MyRst
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr هو اتصال قاعدة البيانات String
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
Set MyConn = Server.CreateObject("ADODB.Connection")
MyConn .open MyConStr 'MyConStr هي سلسلة اتصال قاعدة البيانات
Set MyRst = MyConn.Execute("getUserList",0,4) 'المعلمة الأخيرة له نفس معنى CommandType
Set MyConn = Nothing
'**استدعاء الإجراء المخزن من خلال كائن Recordset**
DIM MyRst
Set MyRst = Server.CreateObject("ADODB.Recordset")
MyRst.open "getUserList",MyConStr,0,1 4
'MyConStr هي سلسلة اتصال قاعدة البيانات، والمعلمة الأخيرة لها نفس معنى CommandType
2. لا يوجد تخزين للمدخلات والمخرجات، يرجى الاطلاع على الإجراء المخزن التالي للعملية
:
/*SP2*/
إنشاء إجراء
dbo.delUserAll
كمجموعة
nocount عند
بدء
الحذف من dbo.[userinfo]
end
go
هذا الإجراء المخزن يحذف جميع السجلات في جدول معلومات المستخدم دون أي إدخال أو إخراج. طريقة الاتصال هي في الأساس نفس الطريقة المذكورة أعلاه، باستثناء أنه ليست هناك حاجة للحصول على مجموعة السجلات :
'**استدعاء الإجراء المخزن من خلال كائن الأمر**
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr هي سلسلة اتصال قاعدة البيانات
MyComm.CommandText = "delUserAll" 'Specify اسم الإجراء المخزن
MyComm.CommandType = 4 'أشير إلى أن هذا إجراء مخزن
MyComm.Prepared = true 'يتطلب تجميع أمر SQL أولاً
MyComm.Execute 'لا حاجة للحصول على مجموعة السجلات هنا
Set MyComm = لا شيء
بالطبع، يمكن أيضًا استدعاء هذه الإجراءات المخزنة من خلال كائن الاتصال أو كائن مجموعة السجلات، ولكن يتم إنشاء كائن مجموعة السجلات للحصول على مجموعة السجلات. إذا لم يتم إرجاع مجموعة السجلات، فمن الأفضل استخدام كائن الأوامر.
3.عند إجراء عمليات مشابهة لحزمة الخدمة SP2،
يجب أن تستفيدالإجراءات المخزنة ذات قيم الإرجاع
بشكل كامل من إمكانات معالجة المعاملات القوية لـ SQL Server للحفاظ على تناسق البيانات.علاوة على ذلك، قد نحتاج إلى الإجراء المخزن لإرجاع حالة التنفيذ لهذه الغاية، قم بتعديل SP2 كما يلي:
/*SP3*/
CREATE PROCEDURE dbo.delUserAll
as
set nocount on
begin
BEGIN TRANSACTION
حذف من dbo.[userinfo]
IF error=. 0
start
COMMIT TRANSACTION
return 1
end
ELSE
begin
ROLLBACK TRANSACTION
return 0
end
return
end
go
الإجراء المخزن أعلاه يُرجع 1 عند تنفيذ الحذف بنجاح، وإلا فإنه يُرجع 0 وينفذ عملية الاستعادة. للحصول على قيمة الإرجاع في ASP، تحتاج إلى استخدام مجموعة المعلمات لتعريف المعلمات:
'**استدعاء الإجراء المخزن بقيمة الإرجاع والحصول على قيمة الإرجاع**
DIM MyComm,MyPara
Set MyComm = Server.CreateObject ("ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr هي سلسلة اتصال قاعدة البيانات
MyComm.CommandText = "delUserAll" 'حدد اسم الإجراء المخزن
MyComm.CommandType = 4' يشير إلى أن هذا إجراء مخزن
MyComm.Prepared = true 'يتطلب تجميع أوامر SQL أولاً
' عبارة إرجاع القيمة
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
MyComm.Parameters.Append MyPara
MyComm.Execute
'احصل على القيمة المرجعة
DIM retValue
retValue = MyComm(0)' أو retValue = MyComm.Parameters(0)
Set MyComm = Nothing
في MyComm.CreateParameter("RETURN"،2,4)، يكون معنى كل معلمة كما يلي:
المعلمة الأولى ("RETURE") هي اسم المعلمة. يمكن تعيين اسم المعلمة بشكل تعسفي، ولكن بشكل عام يجب أن يكون نفس اسم المعلمة المعلن في الإجراء المخزن. هذه هي القيمة المرجعة، والتي عادةً ما أقوم بتعيينها على "RETURE"؛
تشير المعلمة الثانية (2) إلى نوع بيانات المعلمة. للحصول على رموز نوع محددة، يرجى الرجوع إلى مرجع ADO. ما يلي هو رمز النوع الشائع الاستخدام:
adBigInt: 20؛
adBoolean:
11؛
adBTimeStamp: 135؛
adInteger
:
3
؛
adTinyInt: 16
؛
قيم تيجر يمكن أخذها، و-1 إلى -99 هي قيمة محجوزة؛
تشير المعلمة الثالثة (4) إلى طبيعة المعلمة، حيث تشير 4 إلى أن هذه قيمة إرجاع. وصف قيمة هذه المعلمة كما يلي:
0: لا يمكن تحديد النوع؛ 1: معلمة الإدخال؛ 3: معلمة الإدخال أو الإخراج؛ 4:
يجب إرجاع رمز ASP المذكور أعلاه يكون رمزًا كاملاً، وهو أيضًا الكود الأكثر تعقيدًا في الواقع،
Set Mypara = MyComm.CreateParameter("RETURN",2,4)
يمكن تبسيط
MyComm.Parameters.Append MyPara
إلىMyComm.Parameters.Append MyComm.CreateParameter( "RETURN"،2،4)
أو حتى يمكنك الاستمرار في التبسيط، وهو ما سيتم شرحه لاحقًا.
بالنسبة للإجراءات المخزنة ذات المعلمات، لا يمكن استدعاؤها إلا باستخدام كائن الأمر (هناك أيضًا معلومات يمكن استدعاؤها من خلال كائن الاتصال أو كائن مجموعة السجلات، لكنني لم أجربه).
4. القيمة المرجعة للإجراء المخزن مع معلمات الإدخال ومعلمات الإخراج
هي في الواقع معلمة إخراج خاصة. في معظم الحالات، نستخدم الإجراءات المخزنة التي تحتوي على معلمات الإدخال والإخراج. على سبيل المثال، نريد الحصول على اسم مستخدم بمعرف معين في جدول معلومات المستخدم. --معرف المستخدم، ومعلمة الإخراج----اسم المستخدم. الإجراء المخزن لتنفيذ هذه الوظيفة هو كما يلي:
/*SP4*/
CREATE PROCEDURE dbo.getUserName
@UserID int،
@UserName varchar(40) يتم إخراجه
كمجموعة nocount عند
البدء
إذا
كان @UserID فارغًا، قم بإرجاع
حدد @UserName=اسم المستخدم
من dbo .[ معلومات المستخدم]
حيث userid=@UserID
return
end
go
رمز ASP لاستدعاء الإجراء المخزن هو كما يلي:
'**استدعاء الإجراء المخزن مع معلمات الإدخال والإخراج**
DIM MyComm,UserID,UserName
UserID = 1
Set MyComm = Server.CreateObject(" ADODB.Command")
MyComm.ActiveConnection = MyConStr 'MyConStr هي سلسلة اتصال قاعدة البيانات
MyComm.CommandText = "getUserName" 'حدد اسم الإجراء المخزن
MyComm.CommandType = 4 'يشير إلى أن هذا هو إجراء مخزن
MyComm. معد = صحيح 'يتطلب SQL ترجمة الأمر أولاً
وإعلان المعلمات
MyComm.Parameters.append MyComm.CreateParameter("@UserID"،3,1,4,UserID)
MyComm.Parameters.append MyComm.CreateParameter("@UserName"، 200,2,40)
MyComm.Execute
'احصل على المعلمات
UserName = MyComm(1)
Set MyComm = Nothing
في الكود أعلاه، يمكنك أن ترى أنه، على عكس الإعلان عن قيمة الإرجاع، هناك 5 معلمات مطلوبة عند الإعلان عن معلمات الإدخال، و4 المعلمات مطلوبة عند الإعلان عن معلمات الإخراج. عند الإعلان عن معلمات الإدخال، فإن المعلمات الخمس هي: اسم المعلمة، ونوع بيانات المعلمة، ونوع المعلمة، وطول البيانات، وقيمة المعلمة. عند الإعلان عن معلمة الإخراج، لا توجد معلمة أخيرة: قيمة المعلمة.
يجب إيلاء اهتمام خاص لما يلي: عند الإعلان عن المعلمات، يجب أن يكون الترتيب هو نفسه المحدد في الإجراء المخزن، كما يجب أن يكون نوع البيانات وطول كل معلمة متطابقين أيضًا مع تلك المحددة في الإجراء المخزن.
إذا كان الإجراء المخزن يحتوي على معلمات متعددة، فسيظهر رمز ASP مرهقًا، ويمكنك استخدام الأمر with لتبسيط التعليمات البرمجية:
'**استدعاء إجراء مخزن بمعلمات الإدخال والإخراج (رمز مبسط)**
DIM MyComm,UserID,UserName.
معرف المستخدم = 1
قم بتعيين MyComm = Server.CreateObject("ADODB.Command")
مع 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)
.انتهى
التنفيذ باستخدام
UserName = MyComm(1)
Set MyComm = Nothing
إذا أردنا الحصول على أسماء المستخدمين لـ 10 مستخدمين بمعرفات من 1 إلى 10، فهل نحتاج إلى إنشاء كائن الأمر 10 مرات؟ لا. إذا كنت بحاجة إلى استدعاء نفس الإجراء المخزن عدة مرات، فما عليك سوى تغيير معلمات الإدخال وستحصل على مخرجات مختلفة:
'**استدعاءات متعددة لنفس الإجراء المخزن**
DIM MyComm,UserID,UserName
UserName = ""
Set MyComm = Server .CreateObject( "ADODB.Command")
لمعرف المستخدم = 1 إلى 10
مع MyComm
.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 )
.تنفيذ
else
'إعادة تعيين معلمات الإدخال (لا يلزم إعادة تعريف معلمات الإدخال ومعلمات الإخراج التي لا تتغير قيم معلماتها في هذا الوقت)
.Parameters("@UserID") = معرف المستخدم
.تنفيذ
النهاية إذا
انتهى بـ
UserName = UserName + MyComm(1) + "،" ربما ترغب في استخدام مصفوفة لتخزين
Set MyComm
التالي
= لا شيء كماترون من الكود أعلاه: عند استدعاء نفس الإجراء المخزن بشكل متكرر، ما عليك سوى إعادة تعيين معلمات الإدخال التي تغيرت قيمها. هذه الطريقة هي أنه عندما يكون هناك العديد من معلمات الإدخال والإخراج، وتتغير قيمة معلمة إدخال واحدة فقط في كل مرة يتم استدعاؤها، يمكن تغيير مقدار التعليمات البرمجية. خفضت إلى حد كبير.
5. الإجراءات المخزنة التي تحتوي على قيم إرجاع ومعلمات إدخال ومعلمات إخراج في نفس الوقت، كما
ذكرنا سابقًا، عند استدعاء إجراء مخزن، يجب أن يكون الترتيب الذي يتم به الإعلان عن المعلمات هو نفس الترتيب المحدد في الإجراء المخزن. . هناك نقطة أخرى يجب الانتباه إليها بشكل خاص: إذا كان الإجراء المخزن يحتوي على قيمة إرجاع ومعلمات إدخال وإخراج، فيجب الإعلان عن قيمة الإرجاع أولاً.
لتوضيح طريقة الاستدعاء في هذه الحالة، دعونا نحسن المثال أعلاه. لا يزال بإمكانك الحصول على اسم المستخدم للمستخدم ذو المعرف 1، ولكن من المحتمل أن المستخدم غير موجود (تم حذف المستخدم، ومعرف المستخدم هو حقل ذاتي الزيادة). يقوم الإجراء المخزن بإرجاع قيم مختلفة اعتمادًا على ما إذا كان المستخدم موجودًا أم لا. في هذا الوقت، يكون الإجراء المخزن ورمز ASP كما يلي:
/*SP5*/
إنشاء إجراء dbo.getUserName
--من أجل تعميق انطباع "التسلسل"، قم بعكس ترتيب التعريف للمعلمتين التاليتين
@UserName varchar( 40) الإخراج،
@UserID int
كمجموعة nocount عند
البدء
إذا
كان @UserID فارغًا،
حدد @UserName=اسم المستخدم
من
dbo.[userinfo]
إذا كان عدد الصفوف> 0
يُرجع 1
وإلا
يُرجع 0
نهاية
العودة
'** يحتوي الاستدعاء على كل من قيمة الإرجاع وإجراءات الإدخال المخزنة للمعلمات ومعلمات الإخراج **
DIM MyComm,UserID,UserName
UserID = 1
Set MyComm = Server.CreateObject("ADODB.Command")
مع MyComm
.ActiveConnection = MyConStr 'MyConStr هو اتصال قاعدة البيانات string.CommandText
= "getUserName" 'حدد اسم الإجراء المخزن
.CommandType= 4' يشير إلى أن هذا إجراء مخزن
معد = صحيح 'يتطلب تجميع أمر SQL أولاً
' يجب الإعلان عن القيمة المرجعة أولاً.المعلمات.Append
.CreateParameter("RETURN",2,4)
'يتم أيضًا عكس ترتيب الإعلان للمعلمتين التاليتين وفقًا لذلك.Parameters.append
.CreateParameter("@UserName",200,2,40)
.Parameters.append .CreateParameter(" @UserID"،3,1,4,UserID)
.
ينتهي التنفيذ بـ
if MyComm(0) = 1 ثم
UserName = MyComm(1)
else
UserName = "هذا المستخدم غير موجود"
ينتهي إذا
Set MyComm = Nothing
6. الإجراءات المخزنة التي تُرجع المعلمات ومجموعات السجلات في نفس الوقت،
في بعض الأحيان، نحتاج إلى إجراءات مخزنة لإرجاع المعلمات ومجموعات السجلات في نفس الوقت، على سبيل المثال، عند استخدام الإجراءات المخزنة للترحيل، يجب إرجاع المعلمات مثل مجموعات السجلات وإجمالي حجم البيانات في نفس الوقت وقت. ما يلي هو إجراء مخزن لمعالجة الترحيل:
/*SP6*/
إنشاء الإجراء dbo.getUserList
@iPageCount int OUTPUT, - إجمالي عدد الصفحات
@iPage int, - رقم الصفحة الحالي
@iPageSize int - عدد السجلات لكل صفحة
كما
تم تعيين nocount عند
البدء
- إنشاء جدول مؤقت
إنشاء جدول #t (ID int IDENTITY، --معرف
مستخدم حقل الزيادة التلقائية int،
اسم المستخدم varchar(40))
- كتابة البيانات في الجدول المؤقت
وإدراجها في #t
حدد معرف المستخدم، اسم المستخدم من dbo.[UserInfo]
الترتيب حسب معرف المستخدم
- احصل على العدد الإجمالي للسجلات
المعلنة @iRecordCount int
set @iRecordCount = عدد الصفوف
- تحديد إجمالي عدد الصفحات
IF @iRecordCount%@iPageSize=0
SET @iPageCount=CEILING(@ iRecordCount/@iPageSize)
ELSE
SET @iPageCount=CEILING(@iRecordCount/@iPageSize)+1
--إذا كان رقم الصفحة المطلوبة أكبر من إجمالي عدد الصفحات، فاعرض الصفحة الأخيرة
IF @iPage > @iPageCount
SELECT @iPage = @iPageCount
- تحديد سجلات البداية والنهاية للصفحة الحالية
DECLARE @iStart int - سجل البداية
DECLARE @iEnd int - سجل النهاية
SELECT @iStart = (@iPage - 1) * @iPageSize
SELECT @iEnd = @iStart + @iPageSize + 1
- احصل على سجل الصفحة الحالية
حدد * من # t حيث المعرف> @iStart والمعرف <@iEnd
- احذف الجدول المؤقت
DROP TABLE #t
- قم بإرجاع إجمالي عدد السجلات
إلى @iRecordCount
end
goIn
the فوق الإجراء المخزن، أدخل رقم الصفحة الحالية وعدد السجلات في كل صفحة، وأعد الصفحة الحالية ومجموعة السجلات والعدد الإجمالي للصفحات والعدد الإجمالي للسجلات. لكي تكون أكثر نموذجية، يتم إرجاع العدد الإجمالي للسجلات كقيمة إرجاع. ما يلي هو رمز ASP الذي يستدعي الإجراء المخزن (تم حذف عملية الترحيل المحددة):
'**استدعاء إجراء الترحيل المخزن**
DIM pagenow,pagesize,pagecount,recordcount
DIM MyComm,MyRst
pagenow = Request("pn")
'مخصص يتم استخدام الوظيفة للتحقق من الأرقام الطبيعية
إذا كان CheckNar(pagenow) = false ثم pagenow = 1
pagesize = 20
Set MyComm = Server.CreateObject("ADODB.Command")
مع MyComm
.ActiveConnection = MyConStr 'MyConStr هي سلسلة اتصال قاعدة البيانات .CommandText
= "getUserList" 'حدد اسم الإجراء المخزن
.CommandType= 4' يشير إلى أن هذا إجراء مخزن
. إعداد = صحيح 'يتطلب تجميع أوامر 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)
Set MyRst = .Execute
end with
إذا كان MyRst.state = 0، فحينئذٍ "لم يتم الحصول على البيانات، أغلق MyRst
عدد السجلات = -1
وإلا
MyRst.cloud" ملاحظة: للحصول على قيمة المعلمة، تحتاج إلى إغلاق كائن مجموعة السجلات أولاً
عدد السجلات = MyComm(0)
pagecount = MyComm( 1)
إذا كان cint(pagenow)> =cint(pagecount) ثم pagenow=pagecount
ينتهي إذا
Set MyComm = لا شيء
'يعرض ما يلي السجل
إذا كان عدد السجلات = 0 ثم
الاستجابة. اكتب "لا يوجد سجل"
وإلا إذا كان عدد السجلات > 0 ثم
MyRst.open
افعل حتى MyRst.EOF
......
حلقة
'يعرض ما يلي معلومات الترحيل
...
آخر' عدد السجلات=-1
الاستجابة.اكتبنهاية
"خطأ في المعلمة"
إذافيما يتعلق بالرمز أعلاه، هناك نقطة واحدة فقط يجب معالجتها وأوضح: عند إرجاع مجموعة السجلات والمعلمات في نفس الوقت، إذا كنت ترغب في الحصول على المعلمات، فأنت بحاجة إلى إغلاق مجموعة السجلات أولاً، ثم فتح مجموعة السجلات عند استخدامها.
7. الإجراءات المخزنة التي تقوم بإرجاع مجموعات سجلات متعددة
أول ما تقدمه هذه المقالة هو الإجراءات المخزنة التي تقوم بإرجاع مجموعات السجلات. في بعض الأحيان، يلزم إجراء مخزن لإرجاع مجموعات سجلات متعددة في ASP، فكيف يمكن الحصول على مجموعات السجلات هذه في نفس الوقت؟ لتوضيح هذه المشكلة، قم بإضافة حقلين إلى جدول معلومات المستخدم: usertel وusermail، وقم بتعيين بحيث يمكن للمستخدمين الذين قاموا بتسجيل الدخول فقط عرض هذين المحتوىين.
/*SP7*/
إنشاء إجراء dbo.getUserInfo
@userid int،
بت @checklogin
حيث
يتم تعيين nocount عند
البدء
إذا كان @userid فارغًا أو @checklogin فارغًا، قم بإرجاع
اسم المستخدم
من dbo.[usrinfo]
--if Log في المستخدم، احصل على usertel وusermail
إذا @checklogin=1
حدد usertel,usermail
من dbo.[userinfo]
حيث userid=@userid
return
end
go
فيما يلي رمز ASP:
'**استدعاء إجراء مخزن يقوم بإرجاع مجموعات سجلات متعددة**
DIM checklg,UserID,UserName,UserTel,UserMail
DIM MyComm,MyRst
UserID = 1
'checklogin() هي وظيفة مخصصة لتحديد ما إذا كان الزائر قد قام بتسجيل الدخول
checklg = checklogin()
Set MyComm = Server.CreateObject("ADODB.Command" )
مع MyComm
.ActiveConnection = MyConStr 'MyConStr هو سلسلة اتصال قاعدة البيانات.CommandText
= "getUserInfo" 'حدد اسم الإجراء المخزن.CommandType
= 4' يشير إلى أن هذا إجراء مخزن.Prepared
= true 'يتطلب تجميع أمر SQL first.Parameters.append
.CreateParameter ("@userid"،3,1,4,UserID)
.Parameters.append .CreateParameter("@checklogin"،11,1,1,checklg)
Set MyRst = .تنفيذ
النهاية باستخدام
Set MyComm = لا شيء
'من الأول احصل على القيمة من مجموعة السجلات
UserName = MyRst(0)
'احصل على القيمة من مجموعة السجلات الثانية
إذا لم يكن MyRst لا شيء، ثم
Set MyRst = MyRst.NextRecordset()
UserTel = MyRst(0)
UserMail =
ينتهي
MyRst(1)
إذاكان Set MyRst = Nothing
في التعليمات البرمجية أعلاه، يتم استخدام أسلوب NextRecordset لكائن Recordset للحصول على مجموعات سجلات متعددة يتم إرجاعها بواسطة الإجراء المخزن.
حتى الآن، قدمت هذه المقالة شرحًا شاملاً نسبيًا للمواقف المختلفة التي يستدعي فيها ASP الإجراءات المخزنة. وأخيراً، فلنتحدث عن الطرق المختلفة لاستدعاء إجراءات مخزنة متعددة في برنامج ASP.
في برنامج ASP، من الممكن استدعاء إجراءات مخزنة متعددة بالطرق الثلاث التالية على الأقل:
1. إنشاء كائنات أوامر متعددة
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'استدعاء الإجراء المخزن واحد
.. . ...
Set MyComm = Nothing
Set MyComm = Server.CreateObject("ADODB.Command")
'إجراء الاتصال المخزن اثنين
...
Set MyComm = لا شيء
...
2. قم بإنشاء كائن أمر واحد فقط، عند إنهاء مكالمة، امسحه المعلمات
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'استدعاء الإجراء المخزن واحد
...
'مسح المعلمات (بافتراض وجود ثلاث معلمات)
MyComm.Parameters.delete 2
MyComm.delete 1
MyComm.Parameters. حذف 0
'استدعاء الإجراء المخزن الثاني ومسح المعلمات
...
Set MyComm = لا شيء
في هذا الوقت، يرجى ملاحظة: ترتيب مسح المعلمات هو عكس ترتيب إعلان المعلمة والسبب هو أنني لا أعرف .
3. استخدم أسلوب التحديث الخاص بمجموعة بيانات المعلمات لإعادة تعيين كائن المعلمة
DIM MyComm
Set MyComm = Server.CreateObject("ADODB.Command")
'استدعاء الإجراء المخزن واحد
...
'إعادة تعيين كافة كائنات المعلمة الموجودة في مجموعة بيانات المعلمات
MyComm.Parameters.Refresh
'استدعاء الإجراء المخزن 2
...
Set MyComm = لا شيء
من المعتقد بشكل عام أن إنشاء الكائنات بشكل متكرر هو أسلوب أقل كفاءة، ولكن بعد الاختبار (أداة الاختبار هي اختبار مركز تطبيقات Microsoft)، تكون النتائج غير متوقعة:
الطريقة 2 > = الطريقة 1 >> الطريقة 3
سرعة تشغيل الطريقة 2 أكبر من أو تساوي الطريقة 1 (أعلى بنسبة تصل إلى 4٪ تقريبًا). سرعة تشغيل هاتين الطريقتين أسرع بكثير من الطريقة 3 (حتى 130). %))، لذا يوصى باستخدام الطريقة الأولى عندما يكون هناك العديد من المعلمات؛ وعندما يكون هناك عدد قليل من المعلمات، يتم استخدام الطريقة الثانية.
لقد استغرق الأمر مني يومًا حتى أكتب أخيرًا بعضًا من تجربتي السطحية في استدعاء الإجراءات المخزنة في ASP. ومنها، بعضها أعرف فقط التأثيرات وليس الأسباب، وبعضها قد يكون مخطئًا، لكن هذا كله من خلال ممارستي الشخصية. أرجو أن تتقبلوها نقدًا أيها القراء. إذا كان لديك أي آراء مختلفة، واسمحوا لي أن أعرف شكرا مقدما.