หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 2 9 0 9 2 7

7 ธันวาคม พ.ศ.2549
372 Users On-Line.
Visitors - Page views
 8 6 2 1 5 4 8
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

การ Compact ไฟล์ Microsoft Access DataBase +Source Code มาด้วย

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 15/2/2550 6:01:00
(อ่าน : 21683) 

อนึ่งท่านเคยสังเกตบ้างหรือไม่ครับว่า เวลาเราเปิดฐานข้อมูล Access อยู่บ่อยๆ ไฟล์มันก็จะโตเอ้า โตเอา สาเหตุก็เนื่องมาจากการเรียกใช้งานฟิลด์ต่างๆที่เรากำหนดไว้นั่นแหละครับ ผมขออธิบายแบบให้เข้าใจกันได้ง่ายๆ เช่น คุณกำหนดฟิลด์ชื่อ FirstName ให้เป็น Text มีความยาว 50 ตัวอักษร ดังนั้นหน่วยความจำจะต้องจับจองพื้นที่ไว้เต็มเหยียด คือ 50 ไบต์ (ตัวอักษร 1 ตัว = 1 ไบต์) แต่เวลาใช้งานจริงคุณอาจใส่แค่ 20 ตัวอักษร (ใน 1 Record) ส่วนที่เหลือ 30 ไบต์นั่นแหละคือส่วนที่ทำให้ไฟล์มันใหญ่ขึ้นมาได้ แต่ครั้นพอเราไปเปิดดูจากฐานข้อมูลจริงๆ เอ้อ ... มันก็เก็บเพียง 20 ไบต์อยู่นี่นา อ้าว ... แล้วที่เหลือมันไปไหน แล้วทำไมไฟล์มันถึงใหญ่ขึ้นมาได้ล่ะ ... ผมก็ตอบได้แค่นี้แหละ ... 55555 รายละเอียดก็ขอให้หากันเพิ่มเติมเอาเองแล้วกันครับพี่น้อง แต่ขอให้สังเกตในบทความ VB ต่างๆของผม ผมถึงได้กล่าวให้เห็นถึงความสำคัญของการเลือกใช้งาน ชนิดและขนาดของข้อมูล เอาไว้ด้วยเสมอๆนั่นแหละครับ ... พี่น้อง

Design Time
ออกแบบฟอร์ม - Design Time

ประเดี๋ยวบทความนี้มันจะดูเชยๆไป ผมจึงได้ผนวกเอาวิธีการนำเอา Picture Component ซึ่งเป็น Component แบบพื้นฐาน มาประยุกต์ใช้งาน โดยการทำเป็น Progress Bar เพื่อแสดงสถานะในการทำงานให้กับผู้ใช้งานได้เห็นว่า ขณะนี้โปรแกรมมันกำลังทำอะไรอยู่ ซึ่งผมอยากจะแนะนำให้ท่านที่ได้ Download ไฟล์ไปทดสอบดู ท่านจะสามารถพัฒนาตัวเองให้ก้าวไปอีกขั้น ด้วยการนำหลักการนี้ไปสร้างเป็น User Control หรือ ActiveX ในแบบฉบับของท่านลองดูซิครับ ... อย่าเพียงแต่ Copy Code ไปเฉยๆ มันไม่เกิดประโยชน์อย่างเต็มที่หรอกครับ ... เชื่อผมเหอะ

การนำ Picture component มาทำเป็น Progress Bar
การนำ Picture component มาทำเป็น Progress Bar
หลักการที่แท้จริงนั้นก็คือ การหน่วงเวลาไว้เฉยๆครับ ... อิอิ

การประยุกต์ใช้งานของ Progress Bar (แบบจำลอง - เสมือน)
การประยุกต์ใช้งานของ Progress Bar (โดยไม่เรียกใช้ Component) ... อะไรมันจะดูดีมีชาติตระกูลขนาดนั้น

เลือกจาก Project --> References ...
เลือกจาก Project --> References ...
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6 หรือ
ดาวน์โหลด Compact.exe ไม่ใช่ไฟล์ติดตั้งน่ะครับ รันได้เลย แต่ต้อง
ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack มาติดตั้งลงไปก่อนครับ สำหรับเครื่องที่ไม่มีโปรแกรม Visual Basic


Option Explicit
' ไว้ทำเป็น Progress Bar นับค่า 1 - 100
Dim CurrentPercent As Byte

' การรับค่าเข้าสู่ฟังค์ชั่นแบบ Pass by Value และส่งค่ากลับแบบ Boolean (จริง หรือ เท็จ)
Public Function CompactDB(ByVal SourcePath As String, ByVal DestinationPath As String) As Boolean
' นี่คือการดักความผิดพลาด (Trap Error) ของ Visual Basic
' จำเป็นมากครับพี่น้อง ในการสั่งแบบ Goto --> Label (มันชี้ให้เห็นถึง ทฤษฎี กับ ปฏิบัติ เป็นคนละเรื่องกันล่ะครับ ... 55555)
On Error GoTo ErrorHandler
' กำหนดการติดต่อผ่าน Jet Engine
Dim JRO As New JRO.JetEngine

' กำหนดตัวแปรไว้รับ Connection
Dim DbSource As String, DbDestination As String

    ' ส่งไปทำงานแบบ Background Process
    DoEvents
    ' สร้าง Connection ของไฟล์ต้นฉบับ และ ไฟล์ชั่วคราว
    DbSource = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & SourcePath & ";"
    DbDestination = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DestinationPath & ";" & _
    " Jet OLEDB:Engine Type=5;"
    
    JRO.CompactDatabase DbSource, DbDestination
  
    ' หากไม่มีความผิดพลาด ส่งกลับค่าของฟังค์ชั่นให้เป็นจริง (Return)
    CompactDB = True
    Exit Function
  
' Trap Error หากเกิดความผิดพลาด
ErrorHandler:
    ' ส่งกลับค่าของฟังค์ชั่นเป็นเท็จ เพื่อแจ้งให้รู้ว่ามีความผิดพลาดเกิดขึ้นแล้ว
    CompactDB = False
    ' แจ้งหมายเลขความผิดพลาด และ บอกรายละเอียด
    MsgBox "Error Number: " & Err.Number & vbCrLf & Err.Description, vbOKOnly + vbCritical, "รายงานความผิดพลาด"
End Function

Private Sub cmdBrowse_Click()
On Error Resume Next ' ไม่สน Error ใดๆทั้งสิ้น
    dlgOpenFile.DialogTitle = " เลือกไฟล์ MS Access ที่ต้องการกระชับข้อมูล (Compact DataBase) " ' แสดง Title Bar
    dlgOpenFile.Filter = "Microsoft Access Database (*.MDB) | *.MDB" ' เลือก (Filter) เฉพาะไฟล์ MDB
    dlgOpenFile.ShowOpen ' เปิด Dialog ขึ้นมาเพื่อเลือกไฟล์
    dlgOpenFile.CancelError = True ' ยกเลิกทุกๆความผิดพลาด ไม่สนว่างั้นเหอะ ... พี่น้อง
    dlgOpenFile.DefaultExt = "*.MDB" ' ตั้งค่าเป็นมาตรฐานให้เลือกเฉพาะไฟล์ Access (นามสกุล MDB)
    txtFilePath = dlgOpenFile.FileName ' เลือกไฟล์ได้แล้วก็ให้นำไปใส่ไว้ใน TextBox แบบ Full Path เลย
End Sub

Private Sub cmdCompact_Click()
On Error Resume Next
cmdExit.Enabled = False
cmdCompact.Enabled = False
Dim tempFile$ ' กำหนด Path และสร้างไฟล์ชั่วคราว (Temporary)

    tempFile = Dir(App.Path & "\RepairedDB.mdb") ' กำหนดชื่อไฟล์ชั่วคราวไว้รอรับไฟล์ MDB ต้นฉบับ

    If tempFile <> "" Then Kill App.Path & "\RepairedDB.mdb" ' หากมีไฟล์ตัวนี้แล้วให้ลบทิ้งไปก่อน

    Timer.Enabled = True ' เริ่มต้นการทำงาน สั่งให้นาฬิกา (Timer) ทำงานได้ (Progress Bar ทำงาน)
    
    ' บรรทัดนี้สำคัญมากน่ะครับพี่น้อง
    ' ส่งค่าไปฟังค์ชั่น CompactDB หากส่งกลับค่าจริง (True) แสดงว่าทำงานได้ปกติ
    ' ดังนั้นก็สั่งให้ลบไฟล์ MDB ต้นฉบับออกไปได้เลย เพราะข้อมูลในไฟล์  MDB ต้นฉบับ จะถูกเก็บไว้ใน RepairedDB แทน
    ' ขอย้ำอีกครั้งว่าลบไฟล์ต้นฉบับออกน่ะครับ ... เอาไปใช้งานจริงควรทำ BackUp ไว้ก่อนเด้อ ... คิดเป็นการบ้านว่าจะทำยังไงแล้วกัน
    If CompactDB(txtFilePath, App.Path & "\RepairedDB.MDB") Then Kill txtFilePath

' เมื่อกระชับ (Comapct) เรียบร้อยแล้ว
' ก็ให้เปลี่ยนชื่อจาก RepairedDB กลับมาเป็นชื่อไฟล์ MDB ต้นฉบับคืนซ่ะด้วยคำสั่ง Name
Name App.Path & "\RepairedDB.mdb" As txtFilePath
'
End Sub

การคัดลอกไฟล์ต้นฉบับ ไปยังไฟล์ชั่วคราว (Temporary File)
การคัดลอกไฟล์ต้นฉบับ ไปยังไฟล์ชั่วคราว (Temporary File)

Private Sub cmdExit_Click()
    Unload Me
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
   Select Case KeyCode
      Case vbKeyF1: MsgBox "No help now."
      Case vbKeyEscape:
                                        cmdExit_Click
   End Select
End Sub

Private Sub Form_Load()
    Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
    txtFilePath.Text = ""
    If txtFilePath = "" Then cmdCompact.Enabled = False
    CurrentPercent = 0
End Sub

Private Sub txtFilePath_Change()
    If txtFilePath = "" Then
        cmdCompact.Enabled = False
    Else
        cmdCompact.Enabled = True
    End If
End Sub

Private Sub txtFilePath_LostFocus()
    If txtFilePath = "" Then
        cmdCompact.Enabled = False
    Else
        cmdCompact.Enabled = True
    End If
End Sub

' เจ้าตัวนี้แหละครับทำเลียนแบบ Progress Bar โดยไม่ต้องไปเรียก Component มาใช้งาน
Public Function UpdateProgress(pb As Control, ByVal Percent)
Dim Num$
    If Not pb.AutoRedraw Then pb.AutoRedraw = -1
    pb.Cls
    pb.ScaleWidth = 100
    pb.DrawMode = 10
    Num$ = Format$(Percent, "###") + "%"
    pb.CurrentX = 50 - pb.TextWidth(Num$) \ 2
    pb.CurrentY = (pb.ScaleHeight - pb.TextHeight(Num$)) \ 2
    pb.Print Num$
    pb.Line (0, 0)-(Percent, pb.ScaleHeight), , BF
    pb.Refresh
End Function

Private Sub Timer_Timer()
CurrentPercent = CurrentPercent + 10 ' เพิ่มขึ้นทีละ 10 ไปเรื่อยๆ จนถึง 100 ก็จบการทำงาน (Timer.Enabled = False)
    If CurrentPercent <= 100 Then
        UpdateProgress picStatus, CurrentPercent
    Else
        MsgBox "ทำการกระชับไฟล์ระบบฐานข้อมูลเรียบร้อยแล้ว.", vbInformation + vbSystemModal, "Compact & Repair Database"
        Timer.Enabled = False
        Unload Me
    End If
End Sub

Utilities แบบง่ายๆ รวมไปถึงเทคนิคเล็กๆน้อยๆในการทำ Progress Bar แบบไม่ต้องไปเรียกใช้งาน Component ของ VB ให้โปรแกรมมันใหญ่เทอะทะเลยนี่แหละครับ หากนำไปเสียบใส่ไว้ในโปรแกรมของท่าน มันก็จะเป็นการสร้างมูลค่าเพิ่ม (Value Add) ให้งานของท่าน "ดูดีมีชาติตระกูล" ได้อีกโขเลยครับ ... พี่น้อง


จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560