ปัญหา row cannot be located for updating. some values may have been changed since it was last read สาเหตุ เกิดจากการตารางที่โปรแกรม หรือ App ที่เรากำลังพัฒนาได้ถูกใช้งานอยู่ หากใครเคยเรียน DB มา มีศัพท์เทคนิคอีกย่างนึง เรียกว่า Isolation Level นั้นเอง โดยสามารถเกิดได้จาก 2 กรณี ดังนี้ วิธีการแก้ไข
กรณีที่ 1: ให้ตรวจสอบตารางที่เกี่ยวข้องกับหน้าจอนั้น ว่ามี Trigger ที่เกี่ยวข้อง หรือไม่ ถ้ามี
- ถ้ามีให้ทดสอบ Disable ไปก่อน เพื่อแล้วทดสอบการทำงานของระบบ ถ้าสามารถทำงานได้แสดงว่าสาเหตุเกิดจาก Trigger ให้ทำการแก้ไข Trigger โดยการเพิ่มคำสั่ง SET NOCOUNT ON เพื่อไม่ให้ Trigger คืนค่าจำนวน Row ที่ Trigger ได้ทำงานไป เพราะ ตัว ADO หรือ ADO.NET อาจจะเข้าใจผิดว่าการทำงานนั้นเสร็จเรียบร้อยไปแล้ว ทั้งๆที่ยังมีการ Insert/Update หรือ Delete กับฐานข้อมูลรออยู่ โดยการเพิ่มคำสั่ง SET NOCOUNT ON สามารถดูตัวอย่างได้ ดังนี้
SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON Go ALTER TRIGGER [NSECURITYEQ] ON [INVEST].[EQUITY] AFTER INSERT AS BEGIN SET NOCOUNT ON; UPDATE SECURITY SET SECURITY.MATURITYDATE = (SELECT CLOSEDDATE FROM INSERTED) WHERE SECURITY.SECURITYID = (SELECT SECURITYID FROM INSERTED) END
กรณีที่ 2: ถ้าทดสอบแล้ว ไม่เกี่ยวกับตัว Trigger ไปตรวจสอบการตั้งค่า Isolation level ของฐานข้อมูล และปรับแก้ไขให้เหมาะสมครับ
- แนวคิด http://technet.microsoft.com/en-us/library/ms189122(v=sql.90).aspx หรือลองดูอธิบายจากอันนี้ก็ได้ครับ แนวข้อสอบเกี่ยวกับ Isolation level | naiwaen@DebuggingSoft
- วิธี ถ้าว่างจะมาสรุปให้ https://groups.google.com/forum/#!topic/microsoft.public.data.ado/764nH0pwESc
แหล่งข้อมูล
- http://blog.blakedennis.net/2008/05/vb6-ado-error-in-sql-server-70-to-2005.html
- http://stackoverflow.com/questions/790493/row-cannot-be-found-for-locate
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.