ผู้ให้บริการ 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 จะไม่ถูกปิด ฉันปิดมันและไม่สามารถทำงานได้อย่างถูกต้อง
ดังนั้นฉันจึงเขียนโค้ดและออกแบบตารางง่ายๆ ฉันพบว่าสามารถเพิ่มวิธีการเชื่อมต่อได้สองวิธีในเวลานี้ ดังนั้นฉันจึงเปลี่ยนตารางในโค้ดนี้กลับไปเป็นโค้ดดั้งเดิม แต่ก็ยังไม่สามารถดำเนินการได้ เกี่ยวข้องกับนาฬิกามั้ย?
ผมจึงเริ่มศึกษาแบบฟอร์มอย่างละเอียดและพบว่ามีการกำหนดค่าช่องตัวเลขอัตโนมัติในรูปแบบเดิมไว้ในโปรแกรม ฉันจำได้ว่าไม่สามารถกำหนดค่าตัวเลขอัตโนมัติได้ ดังนั้นฉันจึงลบการกำหนดหมายเลขอัตโนมัติของตารางนั้นออก และผลลัพธ์ก็คือสามารถดำเนินการได้ตามปกติ
ดูเหมือนว่าเป็นไปได้ที่จะกำหนดค่าให้กับฟิลด์การเรียงลำดับหมายเลขอัตโนมัติโดยเชื่อมต่อในโหมดผู้ให้บริการ
เรามาพูดถึงความแตกต่างในที่อื่นกันดีกว่า
เมื่อฉันใช้ไดรเวอร์ในการเชื่อมต่อ ค่า Null ปรากฏขึ้นระหว่างการตั้งค่าช่องสัญญาณ แต่จริงๆ แล้วมีค่าอยู่ในฐานข้อมูล ฉันดูประเภทข้อมูลของฟิลด์นี้และมันเป็นความคิดเห็น นั่นหมายความว่าการรองรับโน้ตยาวของคนขับนั้นไม่ดีนักใช่หรือไม่? ไม่ เนื้อหาข่าวในตารางข่าวของฉันต้องเป็นหมายเหตุ ซึ่งไม่ควรเป็นสาเหตุ
สาเหตุคืออะไร? เป็นเพราะเขาอยู่ข้างหลังโน้ตอื่นหรือเปล่า? อย่างไรก็ตาม ยังมีบันทึกย่อสองรายการในตารางข่าว และบันทึกเนื้อหาจะอยู่ด้านหลังบันทึกย่อแนะนำด้วย ความสงสัยนี้ก็ถูกกำจัดไปเช่นกัน
เป็นเพราะช่องนี้มีคีย์เวิร์ดใช่ไหม ฉันเปลี่ยนค่าของฟิลด์นี้เป็น 1 แต่ผลลัพธ์ก็ผิดเช่นกัน
สาเหตุคืออะไร?
เพียงเขียนการทดสอบหน้าอื่นด้วยตัวเองรหัสทดสอบมีดังนี้
ต่อไปนี้เป็นรหัสทดสอบ:
คัดลอกรหัสรหัสดังต่อไปนี้:
การเชื่อมต่อแบบสลัว
ตั้งค่า conn=server.createobject("adodb.recordset")
conn.open "driver={ไดรเวอร์การเข้าถึง Microsoft (*.mdb)};dbq=" & server.mappath("data/dd.mdb") 'วิธีการเชื่อมต่อไดรเวอร์
'conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("data/dd.mdb") 'วิธีการเชื่อมต่อของผู้ให้บริการ
set rs=conn.execute("select * from s_channel โดยที่ channelID=11")
ตอบกลับเขียน rs("UploadSetting")
RS.ปิด
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"),"@")
สิ้นสุดถ้า
เมื่อวางไว้ด้านบนหากเนื้อหาสามารถส่งออกได้ตามปกติ แต่เหตุใดจึงเป็นเอาต์พุต Null เมื่อวางหลังจากนั้น
ดังนั้นรหัสทดสอบสุดท้ายจึงเป็นดังนี้
ต่อไปนี้เป็นรหัสทดสอบ:
คัดลอกรหัสรหัสดังต่อไปนี้:
การเชื่อมต่อแบบสลัว
ตั้งค่า conn=server.createobject("adodb.recordset")
conn.open "driver={ไดรเวอร์การเข้าถึง Microsoft (*.mdb)};dbq=" & server.mappath("data/dd.mdb") 'วิธีการเชื่อมต่อไดรเวอร์
'conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("data/dd.mdb") 'วิธีการเชื่อมต่อของผู้ให้บริการ
set rs=conn.execute("select * from s_channel โดยที่ channelID=11")
ตอบกลับเขียน rs("UploadSetting")
ถ้า IsNull(Rs("UploadSetting")) หรือ rs("UploadSetting")="" แล้ว
ตอบกลับ เขียน "dd"
อื่น
ตอบกลับเขียน rs("UploadSetting")
สิ้นสุดถ้า
RS.ปิด
setrs=ไม่มีอะไร
โค้ดด้านบนสามารถส่งออกค่าใน rs("uploadSetting") ได้อย่างถูกต้องเมื่อเชื่อมต่อในโหมดผู้ให้บริการ แต่ไม่มีเอาต์พุตใดเลยในโหมดไดรเวอร์
เราเข้าใจสิ่งนี้ได้ไหม: ในโหมดไดรเวอร์ เนื้อหาหมายเหตุสามารถอ้างอิงได้เพียงครั้งเดียว และจะกลายเป็นค่า NULL เมื่ออ้างอิงอีกครั้ง สิ่งนี้จะไม่เกิดขึ้นกับผู้ให้บริการ
เพื่อปรับตัวให้เข้ากับสถานการณ์นี้ เราสามารถส่งผ่านตัวแปรได้เท่านั้น ให้เนื้อหาของฟิลด์บันทึกช่วยจำถูกกำหนดให้กับตัวแปรก่อน แทนที่จะถูกยกมาโดยตรง