محاضرة ASP 7: ASP وقاعدة البيانات (2)
الكاتب:Eve Cole
وقت التحديث:2009-05-30 19:55:02
تعلمنا في المحاضرة السابقة كيفية إنشاء اتصال بقاعدة البيانات واسترجاع البيانات من قاعدة البيانات. محتوى اليوم هو كيفية إضافة بيانات جديدة إلى قاعدة البيانات وتعديل البيانات في قاعدة البيانات وحذفها.
1. الطريقة الأولى لإضافة بيانات جديدة إلى قاعدة البيانات: استخدم عبارات SQL، على سبيل المثال wuf50.asp.
ومن أجل تبسيط الإجراءات المستقبلية، يتم وضع جزء الاتصال بقاعدة بيانات Access في ملف ولن يتم شرح هذا الملف عند الحاجة إليه في المستقبل.
<% 'AdoAccess.asp
الخيار صريح
الاستجابة.انتهاء الصلاحية = 0
'الجزء الأول: إنشاء اتصال
ديم سي إن إن، ستركن
تعيين Cnn = Server.CreateObject("ADODB.Connection")
StrCnn = "الموفر = Microsoft.Jet.OLEDB.4.0؛ مصدر البيانات = C:InetpubhomeaspNorthwind.mdb"
Cnn.افتح StrCnn
%>
برنامج wuf50.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<%' wuf50.asp
'الجزء 2: إضافة بيانات جديدة باستخدام كائن تنفيذ الاتصال
خافت StrSQL، rsTest
StrSQL = "أدخل قيم الشاحن (اسم الشركة ورقم الهاتف)('wu''feng','0571-7227298')"
Cnn. تنفيذ StrSQL
%>
<أتش تي أم أل>
<الجسم>
<% 'الجزء 3: عرض مجموعة السجلات التي تم الحصول عليها على المتصفح
تعيين rsTest = Cnn.Execute("اختر * من الناقل")
افعل بينما لا rsTest.EOF
الاستجابة.اكتب rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
حلقة
'الجزء الرابع: تنظيف ساحة المعركة
سي إن إن إغلاق
تعيين rsTest = لا شيء: تعيين Cnn = لا شيء
%>
</الجسم>
</HTML>
يرجى ملاحظة النقاط التالية:
1. عند استخدام عبارات SQL لإضافة بيانات إلى قاعدة بيانات Access، يجب عليك استخدام Insert Into لإضافة بيانات إلى قاعدة بيانات SQL Server، ما عليك سوى استخدام Insert.
2. تنسيق إضافة البيانات باستخدام عبارات SQL هو كما في المثال أعلاه. لاحظ أنه يجب إضافة "wu'feng" في العبارة لأن عبارات SQL تستخدم " كمحدد للسلاسل.
3. من خلال دمج هذا المثال مع ما تعلمته سابقًا، يمكنك إضافة بيانات من نموذج HTML.
4. لاحظ أن هناك حقلاً يحتوي على نوع بيانات للترقيم التلقائي، مثل "معرف الشاحن" في هذا المثال، لذلك لا تحتاج إلى التفكير في كيفية كتابة التعليمات البرمجية للحصول على رقم تزايدي.
الطريقة الثانية: استخدم الأسلوب Addnew لكائن Recordset، على سبيل المثال wuf51.asp.
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<%' wuf51.asp
'الجزء 2: إضافة بيانات جديدة باستخدام أسلوب AddNew لكائن Recordset
خافت StrSQL، rsTest
تعيين rsTest = server.CreateObject("ADODB.Recordset")
rsTest.CursorType = adOpenKeySet 'adOpenDynamic
'بدون الجملة التالية، لن يُسمح بتحديث قاعدة البيانات لماذا؟
rsTest.LockType = adLockOptimistic
rsTest.Open "Shipper"،Cnn،،،adCmdTable
rsTest.AddNew
rsTest("اسم الشركة") = "wu'feng"
rsTest("الهاتف") = "7227298-0571"
rsTest.Update
%>
<أتش تي أم أل>
<الجسم>
<% 'الجزء 3: عرض مجموعة السجلات التي تم الحصول عليها على المتصفح
'حرك مؤشر قاعدة البيانات إلى السجل الأول في الجدول
إذا لم يكن rsTest.EOF <> 0 ثم
Response.اكتب "يوجد [" & rsTest.RecordCount & "] أجزاء من البيانات في الجدول" و"<Br><Br>"
rsTest.MoveFirst
نهاية إذا
افعل بينما لا rsTest.EOF
الاستجابة.اكتب rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
حلقة
'الجزء الرابع: تنظيف ساحة المعركة
سي إن إن إغلاق
تعيين rsTest = لا شيء: تعيين Cnn = لا شيء
%>
</الجسم>
</HTML>
تحليل:
1. لماذا تعيين rsTest.LockType = adLockOptimistic
تحتوي الخاصية LockType لكائن Recordset على أربع قيم اختيارية:
adLockReadOnly - القيمة الافتراضية، تشير إلى أن مجموعة السجلات مفتوحة في وضع القراءة فقط، لذلك لا يمكن تغيير البيانات. في هذه الحالة، سيحدث خطأ عند استخدام أسلوب AddNew.
adLockPessimistic - قفل السجل المحافظ (الدخول عن طريق الإدخال). استخدم طريقة القفل الفوري لسجلات مصدر البيانات عند التحرير. في هذا الوقت، لا يمكن للمستخدمين الآخرين الوصول إلى البيانات.
adLockOptimistic – قفل السجل المفتوح (الإدخال عن طريق الإدخال). يتم تأمين السجلات فقط عند استدعاء أسلوب التحديث. فكر في الأمر، هل هذه الخاصية مشابهة لخصائص القفل والفتح لكائن التطبيق الذي تحدثنا عنه؟
adLockBatchOptimistic - فتح التحديثات المجمعة. يستخدم لتحديث البيانات على دفعات، بما يتوافق مع طريقة UpdateBatch.
بالمناسبة، دعونا نذكر خاصية CursorType المذكورة في المحاضرة السابقة، والتي لها أيضًا أربع قيم:
adOpenForwardOnly - يمكن لمؤشر التوجيه فقط، القيمة الافتراضية، التمرير للأمام فقط في السجل. وهذا يوفر الموارد ويحسن الأداء.
adOpenStatic - مؤشر ثابت. نسخة ثابتة من مجموعة السجلات التي يمكن استخدامها للعثور على البيانات أو إنشاء التقارير. بالإضافة إلى ذلك، لا تكون الإضافات أو التغييرات أو عمليات الحذف التي أجراها مستخدمون آخرون مرئية. يوصى باستخدام هذين المؤشرين فقط في ASP.
adOpenKeyset - مؤشر مجموعة المفاتيح. تشبه مؤشرات مجموعة المفاتيح المؤشرات الديناميكية، إلا أنها محظورة من عرض السجلات التي أضافها مستخدمون آخرون ويحظر عليها الوصول إلى السجلات المحذوفة من قبل مستخدمين آخرين وستظل تغييرات البيانات التي أجراها المستخدمون الآخرون مرئية.
adOpenDynamic - المؤشر الديناميكي. يمكنه رؤية الإضافات والتغييرات والحذف التي أجراها مستخدمون آخرون. يُسمح بجميع أنواع الحركات داخل مجموعة السجلات.
الأمر المؤكد هو أن مثل هذا الوصف المجرد خادع إلى حد ما، وما زلت لا أفهمه تمامًا.
(1) إذا قمت باسترداد البيانات فقط، فما عليك سوى استخدام القيمة الافتراضية؛
(2) إذا كنت تستخدم أسلوب التحديث لتحديث جزء من البيانات، فاستخدم adLockOptimistic لسمة LockType، واستخدم adLockBatchOptimistic إذا كنت تستخدم أسلوب UpdataBatch لتحديث البيانات على دفعات.
(3) إذا كان هناك إجراء كتابة إلى قاعدة البيانات، فيكفي عادةً استخدام adOpenKeyset للسمة CursorType.
ماذا عن ذلك؟ حتى لو لم تفهمه بعد، يمكنك استخدامه.
2. إذا لم تكن على دراية جيدة بقواعد البيانات، فمن المفيد غالبًا استخدام rsTest.MoveFirst لتحريك المؤشر إلى السجل الأول قبل عرض الإخراج. ومع ذلك، إذا لم تكن هناك بيانات في قاعدة البيانات، فلا يمكن استخدام أسلوب MoveFirst، لذا استخدم سمة rsTest.EOF لتحديد ما إذا كانت هناك بيانات في قاعدة البيانات قبل الاستخدام.
3. يمكن استخدام الخاصية RecordCount (للحصول على عدد السجلات في مجموعة السجلات) فقط عند تعيين نوع المؤشر على adOpenKeyset أو adOpenStatic.
2. تعديل البيانات الموجودة في قاعدة البيانات الطريقة الأولى: استخدام عبارات SQL. على سبيل المثال، wuf52.asp، البرنامج مشابه بشكل أساسي لـ wuf50.asp، فقط الأجزاء الرئيسية مذكورة هنا.
'الجزء 2: تعديل البيانات باستخدام أسلوب التنفيذ لكائن الاتصال
خافت StrSQL، rsTest
StrSQL = "تحديث هاتف مجموعة شركات الاتصالات = '(503) 555-3188' حيث يكون الهاتف مثل '%99%'"
Cnn. تنفيذ StrSQL
لتعديل البيانات، لا تحتاج إلى استخدام INSERT INTO...VALUES، ولكن استخدم عبارة UPDATE...SET تعني عبارة WHERE تغيير رقم الهاتف الذي يحتوي على السلسلة "99" ("LIKE" و"%". " تُستخدم غالبًا في الاستعلامات الغامضة) إلى (503) 555-3188، إذا لم يتم تعيين أي شروط، فسيتم تغيير جميع أرقام الهواتف في الجدول.
الطريقة الثانية: استخدم أسلوب التحديث لكائن مجموعة السجلات. برنامج wuf53.asp (مشابه للروتين wuf51.asp)
'الجزء 2: تعديل البيانات باستخدام أسلوب التحديث لكائن Recordset
خافت StrSQL، rsTest
تعيين rsTest = server.CreateObject("ADODB.Recordset")
rsTest.LockType = adLockOptimistic
StrSQL = "حدد الاسم الأخير والاسم الأول وتاريخ الميلاد من الموظف حيث تاريخ الميلاد = #55-03-04#"
rsTest.Open StrSQL، Cnn،،،adCmdText
rsTest("name") = "الصينية"
rsTest.Update
تحليل:
1. في عبارة SQL، إذا كانت قاعدة البيانات هي قاعدة بيانات Access، فيجب تضمين التاريخ في #55-03-04#، كما في هذا المثال؛ إذا كانت قاعدة بيانات SQL Server، فيجب تضمين التاريخ في '55-03 -04'.
2. في rsTest.Open StrSQL، Cnn،،،adCmdText، نظرًا لأن المعلمة الأولى هي عبارة SQL، فإن المعلمة الخامسة هي adCmdText. في الواقع، يمكن حذف المعلمة الخامسة، ولكن إضافتها ستجعل تنفيذ البرنامج النصي أكثر كفاءة.
3. باستخدام الطريقة الأولى، يمكنك تحديث كافة السجلات التي تفي بالشروط (سجلات متعددة أو سجل واحد) في وقت واحد، ولكن التحديث في الطريقة الثانية يمكنه فقط تعديل السجل الحالي (السجل الأول الذي يلبي الشروط).
3. حذف البيانات في قاعدة البيانات الطريقة الأولى: استخدام عبارات SQL. الروتينية wuf55.asp
'الجزء الثاني: استخدام عبارات SQL لحذف البيانات
خافت StrSQL، rsTest
StrSQL = "حذف من شركة الاتصالات حيث رقم الهاتف = '0571-7227298'"
Cnn. تنفيذ StrSQL
الطريقة الثانية: استخدم أسلوب الحذف لكائن Recordset. الروتينية wuf56.asp
'الجزء 2: استخدم أسلوب الحذف لكائن Recordset لحذف البيانات
خافت StrSQL، rsTest
تعيين rsTest = server.CreateObject("ADODB.Recordset")
rsTest.LockType = adLockOptimistic
StrSQL = "حدد * من شركة الاتصالات حيث رقم الهاتف = '0571-7227298'"
rsTest.Open StrSQL، Cnn،،،adCmdText
بينما ليس rsTest.EOF
rsTest.Delete
rsTest.MoveNext
ويند
إذا كانت هناك سجلات متعددة في مجموعة السجلات تفي بالشروط، فيجب عليك استخدام حلقة، وإلا فإن أسلوب الحذف يحذف السجل الحالي فقط، أي السجل الأول الذي يلبي الشروط.
4. المعارف المفيدة الأخرى
1. تحديث البيانات على دفعات تحدثنا أعلاه عن كيفية استخدام طريقة التحديث لكائن Recordset لتحديث البيانات. في الواقع، يمكن لكائن Recordset دعم نوعين من التحديثات: التحديثات الفورية والتحديثات المجمعة.
مع التحديث الفوري، ستتم كتابة كافة التغييرات على البيانات إلى مصدر البيانات الحالي فورًا بمجرد استدعاء أسلوب التحديث.
تعمل التحديثات المجمعة على تمكين الموفر من تخزين التغييرات مؤقتًا على سجلات متعددة ثم استخدام أسلوب UpdateBatch لنقلها إلى قاعدة البيانات في مكالمة واحدة. عند تحديث سجلات متعددة، تكون التحديثات المجمعة أكثر كفاءة من التحديثات الفورية.
الافتراضي هو وضع التحديث الفوري. لاستخدام وضع التحديث الدفعي، استخدم مؤشر العميل، مثل wuf54.asp.
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<%' wuf54.asp
'الجزء 2: وضع التحديث الدفعي
خافت StrSQL، rsTest
تعيين rsTest = server.CreateObject("ADODB.Recordset")
rsTest.CursorLocation = adUseClient 'استخدم نوع مؤشر العميل
rsTest.LockType = adLockBatchOptimistic
StrSQL = "حدد * من شركة الاتصالات حيث الهاتف مثل '%99%'"
rsTest.Open StrSQL، Cnn،،،adCmdText
rsTest.MoveFirst
بينما ليس rsTest.EOF
rsTest("اسم الشركة") = "الصينية"
rsTest.MoveNext
ويند
rsTest.UpdateBatch
%>
<أتش تي أم أل>
<الجسم>
<% 'الجزء 3: عرض مجموعة السجلات التي تم الحصول عليها على المتصفح
rsTest.Requery
افعل بينما لا rsTest.EOF
الاستجابة.اكتب rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
حلقة
'الجزء الرابع: تنظيف ساحة المعركة
سي إن إن إغلاق
تعيين rsTest = لا شيء: تعيين Cnn = لا شيء
%>
</الجسم>
</HTML>
يلاحظ:
1) rsTest.CursorLocation = adUseClient له قيمتان، القيمة الأخرى هي adUseServer (الافتراضية). بالنسبة للمبتدئين، يعد نوع المؤشر لكائن Recordset جزءًا صعبًا، ولن أعرضه بالتفصيل هنا لتجنب المزيد من الارتباك يرجى الاستكشاف ببطء في المعالجة الفعلية (جرب المزيد).
2) rsTest.Requery: استخدم أسلوب Requery لتحديث محتويات كائن مجموعة السجلات لمصدر البيانات بالكامل. استدعاء هذا الأسلوب يعادل استدعاء طريقتي الإغلاق والفتح على التوالي.
2. تعلم كيفية استخدام خاصية التصفية لكائن Recordset
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<%' wuf57.asp
'الجزء الثاني: استخدام خاصية التصفية لكائن مجموعة السجلات
خافت StrSQL، rsTest
تعيين rsTest = server.CreateObject("ADODB.Recordset")
rsTest.CursorType = adOpenStatic
rsTest.LockType = adLockOptimistic
rsTest.Open "Shipper"،Cnn،،،adCmdTable
'قم بتصفية السجلات التي تفي بالمعايير، بينما يتم تصفية السجلات الأخرى
rsTest.Filter = "اسم الشركة = 'wu''feng'"
إذا كان rsTest.EOF ثم "إذا لم يكن هناك مثل هذا السجل، قم بإضافته."
rsTest.AddNew
rsTest("اسم الشركة") = "wu'feng"
rsTest("الهاتف") = "7227298-0571"
rsTest.Update
آخر 'إذا كان هناك سجل يفي بالشرط، قم بتعديل السجل الأول الذي يلبي الشرط
rsTest("الهاتف") = "(571) 7227298"
rsTest.Update
نهاية إذا
%>
<أتش تي أم أل>
<الجسم>
<% 'الجزء 3: عرض مجموعة السجلات التي تم الحصول عليها على المتصفح
"يرجى مقارنة الفرق بين نعم ولا في الجملة التالية بعناية
'rsTest.Filter="" 'يستخدم لمسح سمة التصفية
rsTest.MoveFirst
افعل بينما لا rsTest.EOF
الاستجابة.اكتب rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
حلقة
'الجزء الرابع: تنظيف ساحة المعركة
سي إن إن إغلاق
تعيين rsTest = لا شيء: تعيين Cnn = لا شيء
%>
</الجسم>
</HTML>
3. بالإضافة إلى الطريقتين المقدمتين أعلاه، يمكنك أيضًا استخدام عبارات SQL وأسلوب Excute لكائن Command للحفاظ على قاعدة البيانات. مثال wuf58.asp
<% @LANGUAGE = VBScript %>
<!--#include file="AdoAccess.asp"-->
<!--#include file="adovbs.inc"-->
<%' wuf58.asp
'الجزء 2: صيانة قاعدة البيانات باستخدام عبارات SQL وأسلوب Excute لكائن الأمر
خافت StrSQL، rsTest، cmdChange
StrSQL = "أدخل قيم الشاحن (اسم الشركة ورقم الهاتف)('wu''feng','0571-7227298')"
"إنشاء كائن أمر."
قم بتعيين cmdChange =server.CreateObject("ADODB.Command")
تعيين cmdChange.ActiveConnection = Cnn
cmdChange.CommandText = StrSQL
cmdChange.تنفيذ
%>
<أتش تي أم أل>
<الجسم>
<% 'الجزء 3: عرض مجموعة السجلات التي تم الحصول عليها على المتصفح
تعيين rsTest = server.CreateObject("ADODB.Recordset")
rsTest.Open "Shipper"، Cnn،،، adCmdTable
افعل بينما لا rsTest.EOF
الاستجابة.اكتب rsTest(0) & " " & rsTest(1) & " " & rsTest(2) & " " & "<BR>"
rsTest.MoveNext
حلقة
'الجزء الرابع: تنظيف ساحة المعركة
سي إن إن إغلاق
تعيين rsTest = لا شيء: تعيين Cnn = لا شيء
%>
</الجسم>
</HTML>
تقدم هذه المحاضرة بشكل أساسي ثلاث طرق للحفاظ على البيانات، ويحتاج المبتدئون فقط إلى إتقان الطريقتين الأوليين. بشكل عام، حاول استخدام عبارات SQL لحل المشكلات، وهو أمر بسيط وواضح. أكبر ميزة لاستخدام كائنات Recordset هي أنه يمكنك الاستفادة من العدد الكبير من الخصائص وأنواع المؤشرات الغنية، ولديك المزيد من الخيارات، لكنه يجلب أيضًا بعض الصعوبات في الاستخدام. المفتاح يتعلق باستكشاف المزيد وتجربة المزيد.