อาการ เมื่อคุณใช้ ActiveX Data Objects (ADO) กับ Active Server Pages (ASP) คุณอาจพบข้อผิดพลาดทั่วไปต่อไปนี้:
ผู้ให้บริการ Microsoft OLE DB สำหรับข้อผิดพลาดของไดรเวอร์ ODBC '80004005'
[Microsoft] [โปรแกรมควบคุม ODBC Microsoft Access 97] ต้องใช้แบบสอบถามที่อัปเดตได้
สาเหตุ บทความนี้จะอธิบายสาเหตุหลักสี่ประการของข้อผิดพลาดนี้และวิธีแก้ปัญหาที่เกี่ยวข้อง แม้ว่าบทความนี้จะกล่าวถึงฐานข้อมูล Microsoft Access ข้อมูลที่ให้ไว้ที่นี่จะนำไปใช้กับฐานข้อมูลชนิดอื่นด้วย
วิธีแก้ไข คุณมักจะพบข้อผิดพลาดนี้เมื่อสคริปต์ของคุณพยายามดำเนินการอัปเดตหรือดำเนินการอื่นที่เปลี่ยนแปลงข้อมูลในฐานข้อมูล ข้อผิดพลาดนี้เกิดขึ้นเนื่องจาก ADO ไม่สามารถเขียนลงในฐานข้อมูลได้ด้วยเหตุผลข้อใดข้อหนึ่งต่อไปนี้:
1. สาเหตุที่พบบ่อยที่สุดคือบัญชีผู้เยี่ยมชมอินเทอร์เน็ต (IUSR_MACHINE ซึ่งโดยค่าเริ่มต้นเป็นของกลุ่ม "ทุกคน") ไม่มีการเข้าถึงไฟล์ฐานข้อมูล (.mdb) สิทธิ์ในการเขียน เมื่อต้องการแก้ไขปัญหานี้ ให้ใช้แท็บความปลอดภัยใน Explorer เพื่อปรับคุณสมบัติของไฟล์นี้เพื่อให้บัญชี Internet Guest มีสิทธิ์ที่ถูกต้อง
หมายเหตุ: เมื่อใช้ฐานข้อมูล Microsoft Access กับ ADO คุณต้องให้สิทธิ์ในการเขียนบัญชี Internet Guest ไปยังไดเร็กทอรีที่มีไฟล์ .mdb ด้วย เนื่องจาก Jet สร้างไฟล์ .ldb ที่จัดการการล็อกฐานข้อมูล เนื่องจาก Jet อาจสร้างไฟล์ชั่วคราวในไดเร็กทอรี "Temp" คุณอาจต้องให้สิทธิ์ในการอ่าน/เขียนแก่โฟลเดอร์นั้นด้วย
2. เหตุผลที่สองสำหรับข้อผิดพลาดนี้คือฐานข้อมูลไม่ได้เปิดในโหมดที่ถูกต้องพร้อมสิทธิ์ในการเขียน หากคุณดำเนินการเปิดบนวัตถุการเชื่อมต่อ คุณควรใช้คุณสมบัติโหมดเพื่อระบุสิทธิ์ที่คุณมีในการเชื่อมต่อ ดังนี้:
SQL = "อัปเดตผลิตภัณฑ์ตั้งราคาต่อหน่วย = 2;"
ตั้งค่า Conn = Server.CreateObject("ADODB.Connection")
Conn.Mode = 3 '3 = adModeReadWrite
Conn.เปิด "myDSN"
Conn.ดำเนินการ(SQL)
คอน.ปิด
หมายเหตุ: ตามค่าเริ่มต้น MODE จะถูกตั้งค่าเป็น 0 (adModeUnknown) ซึ่งโดยปกติจะอนุญาตให้อัปเดตได้
3. อีกสาเหตุหนึ่งของข้อผิดพลาดนี้คือ ในผู้ดูแลระบบ ODBC การตั้งค่า "อ่านอย่างเดียว" ในหน้า "ตัวเลือก" ของ DSN อาจถูกเลือกได้
4. ปัญหาล่าสุดและวิธีแก้ไขปัญหาชั่วคราวนำไปใช้กับแหล่งข้อมูล SQL ทั้งหมด คำสั่ง SQL ที่ละเมิด Referential Integrity ของฐานข้อมูลอาจทำให้เกิดข้อผิดพลาดนี้ได้ ต่อไปนี้คือข้อความค้นหาที่ล้มเหลวที่พบบ่อยที่สุดบางส่วน:
• ชุดเคียวรีที่ง่ายที่สุดคือชุดที่คุณไม่สามารถเปลี่ยนแปลงได้: เคียวรีแบบตาราง, เคียวรีแบบพาส-ทรูของ SQL, เคียวรีแบบร่วม หรือเคียวรีการดำเนินการอัปเดต (นั่นคือ สร้างตาราง) ที่มีคุณสมบัติ UniqueValue ตั้งค่าเป็น ใช่
• อีกสาเหตุที่พบบ่อยมากก็คือ การรวมประกอบด้วยดัชนีบนตาราง ODBC ที่เชื่อมโยงซึ่งไม่ซ้ำกัน ในกรณีนี้ SQL ไม่สามารถรับประกันได้ว่าระเบียนในตารางจะไม่ซ้ำกันและค่าของฟิลด์ในตารางจะเปลี่ยนไปตามแบบสอบถาม
• มีเหตุผลที่มีทางเลือกที่เชื่อถือได้จริงๆ ถ้าคุณพยายามที่จะปรับปรุงเขตข้อมูลรวมบนด้าน "หนึ่ง" ของแบบสอบถาม "หนึ่งต่อกลุ่ม" การดำเนินการจะล้มเหลวเว้นแต่คุณจะเปิดใช้งานการปรับปรุงแบบเรียงซ้อน เนื่องจากคุณสามารถมอบหมาย Referential Integrity ให้กับ JET Engine ได้