เกิดปัญหาข้อมูลมันลง database ไม่ทัน มีวิธีหน่วงเวลา แล้วค่อยทำงานต่อไหมคะT_T
มาอธิบายเพิ่มเติมค่ะ ที่เรารู้ว่าเพราะว่ามันบันทึกลงข้อมูลช้า เป็นเพราะว่าเราลอง สร้าง button มาตัวนึง (คือตอน บันทึก จะให้มันอ่านข้อมูลน่ะค่ะ แต่คราวนี้ปิดมันไปก่อน) แล้วให้ button ตัวนี้อ่านข้อมูลแทน เราก็จะพบว่ามันบันทึกได้ปกติ แล้วค่อยมากดปุ่มให้มันอ่านข้อมูล มันก็จะอ่านได้ปกติ ไม่มีอะไรเกิดขึ้น
เหมือนกะว่า โปรแกรมมันอ่านข้อมูลเร็วเกิดไป แต่ Database มันบันทึกข้อมูลลงช้าเกินไปน่ะค่ะ เราก็ไม่เคยเจอแบบนี้มาก่อนเหมือนกัน
T_T
Date :
2012-03-28 18:11:23
By :
mayapopy
ไม่น่าเกี่ยวครับ ลองใช้ Try ในการควบคุม Error ครับ ดักจับด้วย Exception ด้วยก็ได้ครับ
Date :
2012-03-29 06:31:28
By :
webmaster
ถ้าอยากหน่วงเวลาจริง ๆ ใช้ Thread Sleep ครับ
Code (VB.NET)
System.Threading.Thread.Sleep(2000) ' 2 นาที
Date :
2012-03-29 06:32:30
By :
webmaster
หลายๆ ฟอร์มผมก็ทำแบบคุณนะ
พอกดปุ่มบันทึก
ก็สั่งให้บันทึกลงฐานข้อมูล แล้วก็โหลดข้อมูลนั้นขึ้นมาเลย
ก็ไม่เคยเจอปัญหาประการใดนะ
Date :
2012-03-29 08:40:36
By :
watcharop
ขอบคุณพี่วินมากๆเลยค่ะ^^ แต่เราได้วิธีแระ
แต่ว่าอยากรู้สาเหตุน่ะค่ะ ก็เลยมาเล่าให้ฟังแบบละเอียด
เริ่มละนะ^^ ก็คือเราสร้างโปรแกรมลงทะเบียน แบบ ติดต่อกับ Access น่ะค่ะ โดยการทำงานก็ง่ายๆ คือ บันทึกข้อมูลเสร็จ แล้วอ่านข้อมูลเพื่อนำไปเก็บไว้ใน Cookies แต่ปรากฏว่าเวลาใช้งานจริง มัน Error แบบนี้ค่ะ
พอหลังจากนั้นเราก็งงมากว่า ทำไมมันอ่านไม่ได้ ทั้งๆที่ในข้อมูลมันก็บันทึกลงไปได้แบบนี้
เราก็เลยเริ่มมาทำการ Debug ดู แต่ว่าตอนดีบัก กลับปกติ ไม่ Error แล้วก็ได้ค่าที่ต้องการน่ะค่ะ ก็เลยสันนิฐานเอาว่าน่าจะเป็นเพราะว่า ตอนที่มันบันทึกข้อมูล ระหว่างที่ทำการบันทึก โค้ดที่เราเขียนให้อ่านข้อมูล ดันอ่านเร็วไปหน่อย หรือไม่ ข้อมูลที่บันทึกก็ลง Access ช้าไปหน่อย มันก็เลย Error อ่านข้อมูลมาได้เป็นค่าว่าง น่ะค่ะ
ที่นี้ก็มาลอง ปิด Sub ที่ให้อ่านข้อมูลไปก่อน แบบนี้
ก็เลยมาตัดสินใจทดสอบอีกแบบนึง โดยใช้วิธีสร้าง Button แล้วให้มันอ่านข้อมูลและแสดงที่ Label แบบนี้
แล้วก็เขียนโค้ดลงไปแบบนี้
แล้วก็ลงรันดูค่ะ โดยการกดบันทึก แล้วก็รอสัก 1 วิ มากด button1 ปรากฏว่า ได้ผลค่ะ
โปรแกรมไม่ Error แล้วก็ได้ค่าที่ต้องการ ปกติเลย แล้วก็ทำงานต่อได้ ไม่มีปัญหาอะไร
แต่ที่สงสัยก็คือว่า เพราะอะไร ทั้งที่แต่ก่อนมันไม่เป็นน่ะค่ะ บันทึกได้ปกติ ตอนนี้ที่สงสัยก็คือ เครื่องเราโดนไวรัส หรือ Windows ไม่ก็ Access มันมีปัญหาอะไรหรือเปล่า เพราะแต่ก่อนมันไม่เป็น แต่อยู่ๆก็มาเป็น (จากรูปใน Access จะเป็นว่ามีแค่ข้อมูลเดียว เป็นข้อมูลทดสอบ เพราะว่าเราตัดสินใจ ลบข้อมูลทิ้งหมดเลย เพราะตอนแรกคิดว่ามันเป็นเพราะ Access อาจจะมีข้อมูลมากเกินไปเลยอ่านช้า บันทึกไม่ทัน อะไรประมาณนี้ อิอิ เดาอ่ะ^^ แต่ปรากฏว่าไม่ใช่ Error เหมือนเดิม)
จากปัญหานี้ เราพบว่า มันเป็นทุกๆ Page ที่เราสร้างไว้ เวลามีการ Insert ข้อมูล แล้วให้มันอ่านค่าต่อเลย ไม่ว่าจะเป็น listbox อ่านข้อมูลมาอัพเดท หรือ การ อ่านข้อมูลมาเก็บค่าไว้ใน Session หรือ Cookie เป็นหมดเลยค่ะ ไม่ได้ค่าว่าง ก็ Error ไปเลย ตอนนี้โปรแกรมก็เลยมีปัญหามากๆ User ใช้งานไม่ได้ Error ตลอด ลองใช้ Try ดักดูแล้วก็ยัง Error อยู่ดี หรือไม่ก็ใช้ Try ดัก แล้วให้มันข้ามไป ไม่ได้ต้องทำอะไรเลย ผลที่ได้ก็คือ Cookies มันเป็นค่า ว่าง T_T ก็มันข้ามเลยอ่ะ ไม่ได้อ่าน
ตอนนี้เลยคิดวิธีที่จะหน่วงเวลามัน ได้วิธีการใช้ Timer มาค่ะ เลยอยากถามว่า ระหว่าง การใช้ Timer กับใช้ Thread.sleep อย่างไหนดีกว่ากัน
และก็ทดสอบมาแล้วค่ะ โค้ด Timer เราเขียนแบบนี้
แล้วก็ เซ็ต properties ให้มัน Enable = false ไว้ก่อนค่ะ
จากนั้นเราก็ไปใส่โค้ดแบบนี้
แล้วก็แบบนี้
แล้วเราก็ได้ผลลัพภ์ออกมาตามที่ต้องการค่ะ แบบนี้
ก็คือได้ตอนบันทึกวินาที 35 และได้ตอนอ่านวินาทีที่ 36 แต่ที่สงสัยก็คือ เราลอง Degub ในส่วน ของ Tick ของ Timer มันดันวนลูปค่ะ กดยังไงมันก็ไม่ออกจาก Timer Tick สักที แต่เวลาทำงานจริง มันกลับไม่ได้วนลูปนะคะ มันหยุดทำงานตามที่เราตั้งไว้น่ะค่ะ แปลก งง -*-
ที่นี้ก็มาลองวิธีของพี่วิน คือใช้ Thread.sleep ดูบ้าง โดย Add Namespac Threading เข้าไปก่อน
แล้วก็ใส่โค้ดเข้าไปแบบนี้
ปรากฏว่า ผ่านค่ะ สามารถบันทึกข้อมูลได้ (แต่กำหนด 1000 มันเท่ากับ 1 วินาทีเองน่ะค่ะ ตอนแรกๆคิดว่า 1 นาที เพราะเห็นพี่วินบอกว่า 2000 มันเท่ากับ 2 นาที งง^^)
แต่ถ้าเรามากำหนดที่ sleep(500) ปรากฏว่า มัน Error เหมือนเดิมค่ะ
จากการเดา ก็เลยคิดว่ามันหน่วงเวลาหน่อยไปหน่อย ข้อมูลมันลงไม่ทัน หรือเปล่า??
ที่นี่จากที่เราลองสังเกต ระหว่างวิธี Timer กับ Thread.sleep ความต่างก็คือ
วิธีแรกมันจะทำงานบันทึกข้อมูลไปก่อน แล้วรอ 1 วิ ค่อยอ่านข้อมูล
ส่วนวิธีที่สอง มันทำการบันทึก หน่วงเวลา 1 วิ แล้วค่อยอ่านข้อมูล แต่วิธีที่สองมันจะออกผลลัพภ์มาพร้อมกัน (งงไหม) ก็คือ ทั้ง Page มันจะหยุดนิ่งน่ะค่ะ ช่วง 1 วิ เราจะทำอะไรไม่ได้เลย แล้วข้อมูลมันก็ออกมาหลังจาก 1 วิเลย
ง่ายๆน่ะค่ะ ลองทดสอบเอา label1 กับ label2
แล้วใส่โค้ด
label1.text = "1"
threading.sleep(1000)
label2.text = "2"
ผลที่ได้คือ ผลลัพภ์ ของ label1 กับ label2 มันออกมาพร้อมกันค่ะ ไม่ใช่ label1 ออกก่อน แล้วอีก 1 วิ label2 ค่อยออก อะไรแบบนี้อ่ะค่ะ ก็คือมันหน่วงทั้ง Page เลย 1 วินาที แต่ Timer มันจะรันเป็นลำดับ คือ ออก label1 แล้วอีก 1 วินาที ออก label2
แต่ถ้าเอาตามความจริง วิธีของพี่วิน น่าจะดีกว่า คือการ หน่วงเวลา เพราะหาก เราใช้วิธี Timer User ดันกดเร็วไปหน่อย คือ บันทึก และไป Page ต่อไปเลย ภายใน 1 วินาที ก่อนที่ Timer จะทำงาน ก็เท่ากับมันจะ Error เลยค่ะ เพราะยังไม่ได้อ่านข้อมูล
แต่วิธีของพี่วิน ตอนหน่วงเวลา 1 วิ User จะไปกดปุ่มอื่นไม่ได้ จนกว่ามันจะหน่วงเวลาเสร็จก่อนค่ะ^^
ก็ขอบคุณพี่วินมากๆเลยนะคะ ที่นี้เราก็ได้ความรู้ขึ้นมาอีกอย่างนึงแล้ว
แต่ทั้งหมดนี้มีคำถามหน่อยค่ะ
1. วิธีที่เราพูดมาทั้งหมดน่ะค่ะ อยากถามว่า มันถูกต้อง หรือ ผิดตรงไหนหรือเปล่าคะ (คือคิดว่าอาจมีวิธีหรืออะไรบางอย่างที่เราไม่รู้น่ะค่ะ)
2. ทฤษฏีของเรา ที่ให้มันบันทึกแล้วอ่านข้อมูลทันที มันเป็นวิธีที่ถูกต้องไหม เพราะบางทีเราก็คิดว่า ให้มันไปอ่านข้อมูลก่อนที่ User จะไป Page ต่อไปก็ได้ นั่นคือการ ใส่โค้ดให้มันอ่าน ก่อนจะ Redirect ที่ button ก่อนจะไป page อื่น คืออยากรู้ อัลกอลิทึ่ม ของคนอื่นดูน่ะค่ะ
3. อยากรู้ว่า มีวิธีอื่นอีกไหม นอกจาก 2 วิธีที่เราบอกไป (เห็นมีคนบอกว่าให้ใช้ TimeOut ของ javascript จะทำงานได้ดีกว่า)?
ก็ถือว่าแชร์ความรู้ให้คนเพิ่งหัดเขียนหน่อยนะคะ
ขอบคุณทุกคนล่วงหน้าค่ะ และขอบคุณพี่วินมากๆด้วย^^
Date :
2012-03-29 10:01:17
By :
mayapopy
ใช้ค่ะ พี่หางอึ่ง แต่ก่อนมันไม่เป็น แต่อยู่ดีๆมันก็มาเป็น ไม่เข้าใจเลยจริงๆT_T
Date :
2012-03-29 10:07:13
By :
mayapopy
อ๋อ มีเรื่องนึงที่ยังไม่ได้บอกน่ะค่ะ ไม่รู้ว่าเกี่ยวกับหรือเปล่า(แต่สงสัยมานาน) คือเวลาเปิด Access ออกมาแล้วมันชอบขึ้น Error แบบนี้น่ะค่ะ
ซึ่งเราไม่เคยเจอเหมือนกัน แต่คิดว่า Database เราน่าจะมีปัญหาน่ะค่ะ
Date :
2012-03-29 10:11:17
By :
mayapopy
เท่าที่อ่านนี่ เชิงว่า ต้องการ บันทึกข้อมูลแล้วไปตรวจเช็คก่อนบันทึกว่า รหัสลุกค้า ซ้ำหรือปล่าวใช้มั้ยคับ
ถ้าใช่ ก็ เนะนำอีกแบบจะง่ายกว่านะคับ
คือ ถ้าให้มัน Read แล้ว ก็ ไม่ต้อง เอามาเปรียบเทียบคับ ให้มัน Readแล้วฟ้อง เลยว่ามีหรือไม่มี
ส่วนพอบันทึกแล้วแสดงทันที ก็ พอ ปิดฐานข้อมูล ปุ้บ ลองสร้าง Sub มาอีกอันเป็น Loadview แล้วสมมุติว่าใช้ Gridในการโชข้อมูลก้ ทำเป็นการโชแบบ Formload เริ่มต้นได้เลยคับ จะง่ายกว่า
Date :
2012-03-29 10:13:29
By :
xzitachi
แหะๆ สงสัยจะใช้สาเหตุแล้วค่ะ ไปค้นใน google มา เขาบอกว่า การ Query มันจะช้าลง แต่ยังหาวิธีแก้ไม่ได้T_T
Date :
2012-03-29 10:21:40
By :
mayapopy
ตอนเกิด Error ใน ReadCusID
ได้ลองดูหรือยังว่า
1. ตัวแปร sql มีค่าเป็นอะไร
2. ConnectionString ถูกหรือไม่
เมื่อระบบบันทึกข้อมูลสำเร็จแล้ว
ก็ต้องอ่านข้อมูลขึ้นมาได้เลย
Date :
2012-03-29 10:26:29
By :
watcharop
ตอบคุณ Xzitachi ไม่ใช่ค่ะ เป็นการบันทึกข้อมูล แล้วเก็บรหัสลูกค้ามาไว้ใน cookies ค่ะ เพื่อที่ขั้นตอนต่อไปจะเป็นการลงทะเบียน(ขั้นตอนแรกจะเพิ่มรายชื่อลูกค้าก่อน) ที่นี้พอลงทะเบียนเราก็จะมาเพิ่มข้อมูลในอีกตารางนึงค่ะ แต่อยากให้มันเก็บ ID ลูกค้าคนนั้นไว้ด้วย (ID เป็น คีย์ Autonumber ใน Access ค่ะ) เพราะฉะนั้นตอนที่นำข้อมูลมาลงมันจะไม่รู้ว่า ID อะไร จึงต้องอ่าน ID มันออกมาก่อน(จริงๆใช้โค้ดลูกค้าก็ได้ เพราะมันไม่ซ้ำอยู่แล้ว แต่ว่าตารางอื่นๆ เช่น Login มันก็ไม่มีโค้ดน่ะค่ะ มีแต่ ID เลย เพราะฉะนั้นยังไงก็ต้องอ่านมันออกมา) แล้วก็ที่เอาไปไว้ใน Cookies เพราะว่าต้องใช้กับขั้นตอนอื่นๆใน Page ด้วยน่ะค่ะ
ส่วนวิธีที่อ่านแล้วแสดงทันที ลองแล้วมันไม่แสดงเลยค่ะ(กรณีถ้าใส่ sub ที่แสดงข้อมูลเข้าไปในปุ่มเดียวกับบันทึกนะคะ) แต่ถ้าเอา sub ออกมาใส่อีกปุ่มแล้วกด มันจะแสดงได้ค่ะ
ตอนนี้คิดว่าทราบสาเหตุแล้วละค่ะ ว่าน่าจะเป็นที่ Access เรามีปัญหา มัน Query ข้อมูลช้า(ไปหาจากเว็บนอกมา มันบอกอย่างนี้)
แต่ตอนนี้ยังหาวิธีแก้ไม่ได้เลยค่ะ
ขอบคุณ คุณ Xzitachi มากๆเลยนะคะ ที่ช่วยเราแก้ปัญหา ขอบคุณค่า^^
Date :
2012-03-29 10:30:55
By :
mayapopy
ตารางนั้นมีข้อมูลประมาณกี่ record แล้ว
และมีการสร้าง Primary Key และ/หรือ Index บ้างหรือยัง
Date :
2012-03-29 10:31:23
By :
watcharop
แหะๆ ตอบไม่ทัน ตอบพี่หางอึ่งค่ะ คือมัน Error เป็นบางครั้งค่ะ แต่จะ Error ตอนไหนนี่ มันก็...เป็นบางครั้งอ่ะค่ะ บางทีเราเปิดเว็บก่อน แล้วเปิด Access มันก็เป็น บางทีมันก็ไม่เป็นค่ะ บางทียังไม่ได้เปิดโปรแกรม หรือเว็บอะไรเลย แล้วไปเปิด Access มันก็เป็นค่ะ แต่บางทีก็ไม่เป็น -*-
Date :
2012-03-29 10:33:21
By :
mayapopy
ตอบพี่หางอึ่งค่ะ ตัวแปรเป็น Select CustomerID From CustomerTB Where CustomerCode = 'A0012' ค่ะ
แต่ dr.read เราอ่าน dr("CustomerID") ซึ่งมัน Error ตรงนี้ค่ะ ก็เลยคิดว่ามันเป็นค่าว่าง อ่านไม่เจอน่ะค่ะ
Date :
2012-03-29 10:36:11
By :
mayapopy
http://superuser.com/questions/41877/why-does-access-report-it-cant-receive-a-command-to-its-program
ลิ้งค์ ตามนี้ค่ะ
Date :
2012-03-29 10:36:57
By :
mayapopy
โอ๊ะ ผิด อันนั้นเป็นวิธีแก้ แต่ยังแก้ไม่ได้ เดี๋ยวว่าจะลอง Repair Access เหมือนที่เขาบอก
เดี๋ยว หาก่อนนะคะ ดันปิดไปแล้ว
Date :
2012-03-29 10:37:47
By :
mayapopy
หาไม่เจออ่ะ เจอแต่คนที่เป็นเหมือนกัน เขาบอกว่า Query ช้าเหมือนกัน แต่เป็นคนไทยนะ
http://www.thai-access.com/topic_post.asp?CategoryID=1&TopicID=2335
คือจำไม่ได้ว่า Serch ว่าอะไร-*-
Date :
2012-03-29 10:39:10
By :
mayapopy
ตอนนี้ไม่มีข้อมูลแล้วค่ะ มีอยู่ไม่กี่ Record เพราะว่าลบหมดแล้ว เป็นตารางเปล่า เอาไว้มา Test เฉยๆ ส่วน Primary Key ตั้งไว้หมดแล้วค่ะ
Date :
2012-03-29 10:40:15
By :
mayapopy
อันนี้ค่ะ http://answers.microsoft.com/en-us/windows/forum/windows_7-windows_programs/there-was-a-problem-sending-the-command-to-the/56ee1743-b476-43a5-9b00-169b8c6ef37a
เจอแระ
ตรงที่เขาบอกว่า
my earlier query I have noticed the following คือ Query ช้า น่ะค่ะ ก็เลยคิดว่า Access เราน่าจะมีปัญหา
Date :
2012-03-29 10:43:08
By :
mayapopy
เดี๋ยวจะลอง ถอด Access แล้วลงใหม่ดูก่อนนะคะ (ไม่รู้จะแก้ได้หรือเปล่า)
อ๋อ ขอบคุณมากๆนะคะ ขอโทษที่ตอบช้าค่ะT_T
Date :
2012-03-29 10:44:13
By :
mayapopy
ในส่วนการโหลดทันทีหลังบันทึกแล้ว
ทำในหลังบันทึกได้เลยคับโดย
สมมุติว่า
บันทึกข้อมูลเสร็จแล้วให้เช่น
Code (VB.NET)
msgbox("บันทึกสมบบูรณ์")
end if
Loadview()
แล้วสร้าง Private Sub Loadview() ขึ้นมา โดยในส่วนนี้จะ เป็นการเรียกให้โปรแกรมอ่านค่า เหมือนตอน Form_Load เลยคับ ต่างแค่ ตัวนี้จะไม่ทำงานในส่วนของการรันถ้าเกิดไมม่ีการเรียกใช้ของโปรแกรม คับ
Date :
2012-03-29 10:51:59
By :
xzitachi
ถอน Access ออก แล้วลงใหม่ ก็ยังขึ้นเหมือนเดิมค่ะ T_T
Date :
2012-03-29 11:20:07
By :
mayapopy
Load balance : Server 00