ผู้ให้บริการ 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) 'วิธีการเชื่อมต่อของผู้ให้บริการ
ตั้งค่า rs=conn.execute (เลือก * จาก 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(การอัพโหลดการตั้งค่า),@)
สิ้นสุดถ้า
เมื่อวางไว้ด้านบนหากเนื้อหาสามารถส่งออกได้ตามปกติ แต่เหตุใดจึงเป็นเอาต์พุต 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) 'วิธีการเชื่อมต่อของผู้ให้บริการ
ตั้งค่า rs=conn.execute (เลือก * จาก s_channel โดยที่ channelID=11)
การตอบสนองเขียน rs (UploadSetting)
ถ้า IsNull(Rs(UploadSetting)) หรือ rs(UploadSetting)= แล้ว
ตอบกลับเขียน dd
อื่น
การตอบสนองเขียน rs (UploadSetting)
สิ้นสุดถ้า
RS.ปิด
setrs=ไม่มีอะไร
โค้ดด้านบนสามารถส่งออกค่าใน rs(uploadSetting) ได้อย่างถูกต้องเมื่อเชื่อมต่อในโหมดผู้ให้บริการ แต่ไม่มีเอาต์พุตใดเลยในโหมดไดรเวอร์
เราเข้าใจสิ่งนี้ได้ไหม: ในโหมดไดรเวอร์ เนื้อหาหมายเหตุสามารถอ้างอิงได้เพียงครั้งเดียว และจะกลายเป็นค่า NULL เมื่ออ้างอิงอีกครั้ง สิ่งนี้จะไม่เกิดขึ้นกับผู้ให้บริการ
เพื่อปรับตัวให้เข้ากับสถานการณ์นี้ เราสามารถส่งผ่านตัวแปรได้เท่านั้น ให้เนื้อหาของฟิลด์บันทึกช่วยจำถูกกำหนดให้กับตัวแปรก่อน แทนที่จะถูกยกมาโดยตรง