จะป้องกันError"File may be corrupt"ขณะLoad Data ผ่าน odbcหรือOraOLEDB อย่างไร



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

14 ก.พ. 62 , 17:00:45
อ่าน 1219 ครั้ง

Piya125

ผมเขียน SQL ใน Access VB ผ่าน OraOLEDB เพื่อload data จากOracle มาเก็บไว้ใน Table ใน Access file โดยload แต่ละครั้งประมาณไม่ต่ำกว่า 2ล้าน records บางครั้งก็load ได้จนจบ บางครั้งก็เกิด error ตามนี้ครับ

Run-time error '3049' Cannot open database".It may not be a database that your application recognizes, or the file may be corrupt.

โค๊ดเริ่มต้นด้วย SQL  ดึงข้อมูลมาแล้วมา AddNew ใส่ Table ขณะที่กำลัง AddNew นั้นมักจะ Error ครับ ไม่ทราบจะป้องกันอย่างไร ขอบคุณครับ

conn.ConnectionTimeout = 0
conn.Open "Provider=OraOLEDB.Oracle;User id=XXXX;Password=XXXX;Data Source=XXXdb1;FetchSize=250;CacheType=Memory"

sqlstr = "select W.*, T.MATL_TYPE_CD, S.SIZE_ABBREVIATION,B.PURCHASE_MAJOR_CLASS, B.PURCHASE_MINOR_CLASS" & vbLf & _
         "from DA.ITEM_SIZE S, DA.MFG_PATH_BUY B, DA.MPS_ORDER_DETAIL W, DA.STYLE T" & vbLf & _
         "where W.SIZE_CD = S.SIZE_CD AND W.DEP_STYLE = T.STYLE_CD AND B.STYLE_CD = W.DEP_STYLE AND B.SIZE_CD = W.DEP_SIZE_CD" & vbLf & _
         "AND B.ATTRIBUTE_CD = W.DEP_ATTRIBUTE_CD AND B.COLOR_CD = W.DEP_COLOR AND B.PLANT_CD = W.DEP_PLANT "

p_rec.Open sqlstr, conn

If p_rec.EOF = False Then
      Set rs = CurrentDb.OpenRecordset("OPEN_WORKORDER_DEMAND")
      Do Until p_rec.EOF
        rs.AddNew
        rs!DETAIL_TYPE = p_rec!DETAIL_TYPE
        rs!DEP_STYLE = p_rec!DEP_STYLE
        rs!DEP_COLOR = p_rec!DEP_COLOR
        rs!DEP_ATTRIBUTE_CD = p_rec!DEP_ATTRIBUTE_CD
        rs!DEP_SIZE_CD = p_rec!DEP_SIZE_CD
        rs!DEP_STYLE_17DIG = p_rec!DEP_STYLE & p_rec!DEP_COLOR & p_rec!DEP_ATTRIBUTE_CD & p_rec!DEP_SIZE_CD
        rs!DEP_PLANT = p_rec!DEP_PLANT
        rs!Style = p_rec!Style
   

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

17 ก.พ. 62 , 13:39:09
ตอบกลับ #1

สันติสุข

1. ลองดูว่าไฟล์ฐานข้อมูลของ Access มีขนาดใกล้ 2 GB ซึ่งเป็นขนาดสูงสุดที่ Access ให้ใช้ได้หรือเปล่า ถ้าใกล้หรือเต็มแล้ว ก็ต้องทำ Compact and Repair Database ของตัว Access เพื่อกระชับฐานข้อมูลให้เล็กลงก่อนครับ เพราะการลบเรคอร์ด,เทเบิล หรืออะไรต่างๆในไฟล์ Access จะไม่ได้ทำให้ขนาดของไฟล์ลดลงไปในทันทีครับ

2. อยากให้ปรับ SQL จากการอ้างหลายๆเทเบิลใน FROM cluase โดยไม่มีการ JOIN กันเลย แต่ไปใช้เงื่อนไขใน WHERE clause เป็นตัวจับคู่เรคอร์ดระหว่างเทเบิล S,B,W,T แทน ซึ่งผลของ FROM cluse แบบนี้ เป็นไปได้ว่า Oracle จะหาผลทุกเรคอร์ดจากทุกเทเบิลจับคู่กันหมดก่อน แล้วค่อยเอาผมมากรองโดย WHERE cluase เป็นลำดับถัดไป (ลำดับการทำงานของ Oracle-SQL https://oracle.readthedocs.io/en/latest/sql/basics/query-processing-order.html link) ถ้าแต่ละเทเบิลมีแค่ 100 เรคอร์ด เราจะได้ 100x100x100x100 = 100 ล้านเรคอร์ดออกมาก่อน ถึงจะค่อยถูกกรองโดย WHERE cluase อีกที ดังนั้นอยากให้ใส่ JOIN ใน FROM cluase เพื่อเชื่อมเรคอร์ดที่สัมพันธ์กันของแต่ละเทเบิลให้เสร็จก่อนจะมีประสิทธิภาพกว่าครับ ... ***แต่***ก็ไม่แน่ครับ ถ้าตัว Query Processing ของ Oracle ฉลาด มันก็จะไปเอาเงื่อนไขใน WHERE cluase ผนวกเข้าไปคิดพร้อมขั้นตอน FROM cluase เลยก็ได้
ช่วยพกถุงผ้า/ถุงพลาสติกใช้แล้วไปซื้อของเพื่อลดการใช้พลาสติก ขยะ รักษาสิ่งแวดล้อม และไม่ให้ภาวะโลกร้อนวิกฤติเร็วขึ้นกว่านี้
ช่วยคลิกโฆษณาข้างล่างนี้ เพื่อสนับสนุนเวปบอร์ดด้วยครับ
:nice day:
 
โพสต์นี้ได้รับคำขอบคุณจาก: taeclubz, Piya125

18 ก.พ. 62 , 14:57:37
ตอบกลับ #2

Piya125

ขอบคุณครับ

 


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