mySQL + Access / write conflict เฉพาะข้อมูลที่เพิ่มใหม่ ข้อมูลเก่าแก้ไขได้ปกติ



0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

08 เม.ย. 63 , 13:41:36
อ่าน 285 ครั้ง

Kxess

ก่อนอื่น
ผมใช้ access + mysql (ฐานข้อมูลอยู่บน www)
โดยฐานข้อมูลนี้ export มาจาก sql server โดยไม่มี error ใด ๆ ครับ กำหนด pk เรียบร้อยหมดแล้ว

อาการ
- การดึงข้อมูลมาแสดงทำได้ปกติ
- ข้อมูลที่เพิ่มใหม่ เพิ่มได้ แต่แก้ไขไม่ได้ ฟ้อง write conflict
- แต่ข้อมูลเก่า แก้ไขได้ปกติ




ไม่ทราบว่ามีแนวทางการแก้ปัญหาแนะนำมั้ยครับ
ขอบคุณครับ
« แก้ไขครั้งสุดท้าย: 09 เม.ย. 63 , 13:20:30 โดย Kxess »

 

08 เม.ย. 63 , 22:21:29
ตอบกลับ #1

สันติสุข

แนะนำว่าหลังจากเพิ่มเรคอร์ดใหม่แล้ว ให้ไปเปิดดูเรคอร์ดนั้นด้วยโปรแกรม MySQL โดยตรงทันที หาดูว่ามีฟิลด์อะไรที่ค่าเปลี่ยนแปลงไปจากหน้าฟอร์มหรือไม่  ถ้ามี ก็เป็นไปได้ว่าน่ามีความไม่ compatible กันระหว่าง data type บนหน้าฟอร์มกับ data type บนฟิลด์ในเทเบิล ทำให้ ODBC แปลงข้อมูลโดยอัตโนมัติเพื่อให้สามารถเก็บลงเทเบิลได้ ซึ่ง Access จะมองว่านั่นคือ ข้อมูลที่เพิ่งป้อนถูกแก้ไขไปอีกทีแล้ว สิ่งที่อยู่บนหน้าฟอร์มกับเทเบิลไม่เหมือนกันแล้วนะ ดังนั้นก่อนการบันทึกข้อมูลที่เราแก้ไขด้วยตัวเราเองอีกครั้งบนเรคอร์ดที่เพิ่งเพิ่มเข้าไป   Access ก็เลยเตือนออกมาอย่างที่เห็น   สำหรับ data type อะไรใน Access ควรแปลงไปเป็น data type อะไรใน MySQL  ให้ลองหาในเวปดูนะครับ  ส่วนสาเหตุอื่นๆนี่ อาจมี แต่ผมไม่รู้แล้วครับ

ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 
โพสต์นี้ได้รับคำขอบคุณจาก: Kxess

09 เม.ย. 63 , 12:55:37
ตอบกลับ #2

Kxess

ลืมแจ้งเพิ่มเติม ตอนกดปุ่ม save ลองจับ error ดู มันฟ้อง
error 3021 No current record.


ตอนนี้แก้ปัญหาได้แล้วครับ
ตอบไว้เผื่อใครเจอปัญหาเดียวกันครับ

--------------------------------------
ผมทดลองโคลนตาราง customer จากเดิมชนิดข้อมูล ที่เก็บค่า จริงเท็จ
case1 > customer_test1 ใช้เป็นค่าเดิมคือ bit(1) ใน Access แสดงชนิดข้อมูลเป็น Yes/No
case2 > customer_test2 แก้ไขจาก bit(1) เป็น tinyint(1) ใน Access แสดงชนิดข้อมูลเป็น Number(integer)
case3 > customer_test3 ลบฟิลด์ข้อมูล bit(1) ทิ้งทั้งหมด
case4 > customer_test3 สร้างฟิลด์ ชนิดข้อมูล bit(1) เหมือน case 1

ทดลองเปิดด้วยฟอร์มเดิม เปลี่ยนแค่ Record Source

case1 > แก้ไขข้อมูลไม่ได้ แจ้ง write conflict เหมือนเดิม
case2 > แก้ไขข้อมูลได้ปกติอย่างที่ต้องการ  (mySQL เก็บค่า True = -1 / False = 0)
case3 > แก้ไขข้อมูลได้ปกติอย่างที่ต้องการ 
case4 > แก้ไขข้อมูลได้ปกติอย่างที่ต้องการ  (mySQL เก็บค่า True = 1 / False = 0)

แต่มีตาราง Product ที่แม้ว่าค่าเดิมจะเป็น bit(1) ก็สามารถใช้งานได้ปกติ

ดูไปดูมา ปรากฎว่า ฟิลด์ที่จะเก็บค่าจริงเท็จ มีเป็นค่า NULL d

- สรุป -
เป็นเพราะฟิลด์ที่เป็น bit(1) มีค่า NULL
ใน case 4 ที่ลบ ฟิลด์ข้อมูล bit(1) ทิ้งแล้วสร้างใหม่ เป็น bit(1) เหมือนเดิม แต่ใช้งานได้ เพราะเมื่อสร้างใหม่ ค่าเริ่มต้นถูกกำหนดให้เป็น 0 ทั้งหมด ไม่มีฟิลด์ใดว่าง
ใน case 2 แม้มีค่าว่าง แค่ใช้งานได้ปกติ เดาว่า เพราะ tinyint(1) อนุญาตให้มีค่าว่างได้


แต่สุดท้ายผมจะเปลี่ยนฟิลด์ bit(1) เป็น tinyint(1) ทั้งหมด

ขอบคุณครับ

--------------------------------------

 
โพสต์นี้ได้รับคำขอบคุณจาก: สันติสุข


บอร์ดเรียนรู้ Access สำหรับคนไทย