موفر Microsoft OLE DB لخطأ برامج تشغيل ODBC '80040e21' أنتجت عملية OLE DB متعددة الخطوات خطأ. إذا كان ذلك ممكناً، تحقق من كل قيمة حالة OLE DB. لم يتم إنجاز أي عمل.
برنامج موقع حدث خطأ عند إضافة الأخبار
فيما يلي رسالة الخطأ:
خطأ موفر Microsoft OLE DB لبرامج تشغيل ODBC "80040e21"
تقوم عملية OLE DB متعددة الخطوات بإنشاء أخطاء. إذا كان ذلك ممكناً، تحقق من كل قيمة حالة OLE DB. لم يتم إنجاز أي عمل.
سبب هذا الخطأ هو أنني قمت بتغيير سلسلة اتصال الوصول إلى "Driver={Micorsoft Access Driver ()};dbq=" & Server.Mappath(DbPath)، بينما كانت سلسلة الاتصال الأصلية هي "Provier=Microsoft. سيؤدي هذا الخطأ لا تحدث عند Jet.OLEDB.4.0;مصدر البيانات = "& Server.Mappath(DbPath). يبدو أن هناك بعض الاختلافات بين هاتين الطريقتين للاتصال بقاعدة بيانات الوصول. على الأقل، تعتبر طريقة الاتصال الأخيرة أفضل من حيث التسامح مع الخطأ، ولكن من الواضح أنها أقل رسمية من حيث المواصفات.
من أجل التبسيط، سأسمي هاتين الطريقتين اتصال الموفر واتصال برنامج التشغيل أدناه.
لا يظهر الخطأ أعلاه عند تعديل الخبر. لقد نظرت إلى الكود ووجدت أنه عند الإضافة، لم يتم إغلاق مجموعة السجلات التي تم الحصول عليها باستخدام Excute. لقد قمت بإيقاف تشغيله ولم أتمكن من تشغيله بشكل صحيح.
لذلك كتبت جزءًا من التعليمات البرمجية وصممت جدولًا بسيطًا، ووجدت أنه يمكن إضافة طريقتين للاتصال في هذا الوقت، لذلك قمت بتغيير الجدول في هذا الكود مرة أخرى إلى الجدول الأصلي، لكن لا يزال يتعذر تنفيذه. هل له علاقة بالساعة؟
لذلك بدأت بدراسة النموذج بعناية ووجدت أن النموذج الأصلي يحتوي على حقل رقم تلقائي تم تعيين قيمة له في البرنامج. أتذكر أنه لا يمكن تعيين قيم للأرقام التلقائية. لذلك قمت بإزالة الترقيم التلقائي لهذا الجدول، وكانت النتيجة أنه يمكن تنفيذه بشكل طبيعي.
يبدو أنه من الممكن تعيين قيم لحقل الترقيم التلقائي من خلال الاتصال في وضع الموفر.
دعونا نتحدث عن الفرق في مكان آخر.
عندما استخدمت برنامج التشغيل للاتصال، ظهرت قيمة فارغة أثناء إعداد القناة، ولكن في الواقع كانت لها قيمة في قاعدة البيانات، ونظرت إلى نوع بيانات هذا الحقل وكان تعليقًا. هل هذا يعني أن دعم السائق للملاحظات الطويلة ليس جيدًا جدًا؟ لا، يجب أن يكون محتوى الأخبار في جدول الأخبار الخاص بي عبارة عن ملاحظات.
ما هو السبب؟ هل لأنه وراء مذكرة أخرى؟ ومع ذلك، توجد أيضًا ملاحظتان في جدول الأخبار، كما توجد ملاحظات المحتوى أيضًا خلف ملاحظات المقدمة. تم القضاء على هذا الشك أيضا.
هل لأن هذا الحقل يحتوي على كلمات رئيسية؟ لقد غيرت قيمة هذا الحقل إلى 1، ولكن النتيجة كانت خاطئة أيضًا.
ما هو السبب؟
فقط اكتب صفحة أخرى اختبرها بنفسك، رمز الاختبار هو كما يلي
وفيما يلي رمز الاختبار:
انسخ رمز الكود كما يلي:
كون خافت
مجموعة conn=server.createobject("adodb.recordset")
conn.open "driver={Microsoft Access driver (*.mdb)};dbq=" & server.mappath("data/dd.mdb") 'طريقة اتصال برنامج التشغيل
'conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("data/dd.mdb") 'طريقة اتصال الموفر
تعيين rs=conn.execute("اختر * من s_channel حيث معرف القناة=11")
Response.Write rs("UploadSetting")
rs. Close
setrs=لا شيء
إذا وجد أن كلا الاتصالين يمكنهما الإخراج بشكل طبيعي.
لذلك قمت بإخراج (response.write) في الكود الأصلي حيث تم فتح مجموعة السجلات للتو، ووجدت أن قيمة الحقل يمكن إخراجها بشكل طبيعي في ذلك الموقع. لذلك واصلت نقل رمز الإخراج إلى الأسفل، وأخيراً قمت بنقله إلى
إليك مقتطف الكود:
انسخ رمز الكود كما يلي:
إذا كان IsNull(rs("UploadSetting")) أو rs("UploadSetting")="" ثم
UploadSetting=Split("1,2,3,4@Other@2@0@jpg|gif|bmp|png@100@1@swf@500@1@rm|mp3|wav|mid|avi|mpg|mpeg |asf|wma@2048@1@rar|zip|exe|doc|xls|chm@2048@1"،@")
آخر
UploadSetting=Split(rs("UploadSetting"),"@")
نهاية إذا
إذا تم وضعه فوق if، فيمكن إخراج المحتوى بشكل طبيعي، ولكن إذا تم وضعه بعد آخر، فسيتم إخراج Null لماذا؟
وبالتالي فإن رمز الاختبار النهائي هو كما يلي
وفيما يلي رمز الاختبار:
انسخ رمز الكود كما يلي:
كون خافت
مجموعة conn=server.createobject("adodb.recordset")
conn.open "driver={Microsoft Access driver (*.mdb)};dbq=" & server.mappath("data/dd.mdb") 'طريقة اتصال برنامج التشغيل
'conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("data/dd.mdb") 'طريقة اتصال الموفر
تعيين rs=conn.execute("اختر * من s_channel حيث معرف القناة=11")
Response.Write rs("UploadSetting")
إذا كان IsNull(Rs("UploadSetting")) أو rs("UploadSetting")="" ثم
الرد.اكتب "dd"
آخر
Response.Write rs("UploadSetting")
نهاية إذا
rs. Close
setrs=لا شيء
يمكن للكود أعلاه إخراج القيمة بشكل صحيح في rs("uploadSetting") عند الاتصال في وضع الموفر، ولكن لن يتم إخراج أي شيء في وضع برنامج التشغيل.
هل يمكن أن نفهم هذا: في وضع برنامج التشغيل، لا يمكن الرجوع إلى محتوى الملاحظة إلا مرة واحدة، وسيصبح قيمة فارغة عند الرجوع إليه مرة أخرى. لن يحدث هذا مع الموفر.
للتكيف مع هذا الوضع، يمكننا فقط تمرير متغير. دع محتوى حقل المذكرة يُعطى للمتغير أولاً، بدلاً من أن يتم اقتباسه مباشرة.