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

หรือติดต่อเข้ามาทาง 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 5 9 1 7 7 3

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

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

การกำหนด Path ของไฟล์ฐานข้อมูลด้วย INI (Initialized File) โดยที่ไม่ต้องเรียกใช้งาน API

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 1/8/2551 4:04:00
(อ่าน : 21637) 
มีคำถามมาหาผมเกี่ยวกับการกำหนด Path ให้กับไฟล์ฐานข้อมูล MS Access กันเยอะมาก ซึ่งส่วนใหญ่ก็จะนำไปใช้ในเรื่องของ File Sharing เพื่อให้รันฐานข้อมูลข้ามเครื่องได้ กระผมก็เต็มใจที่จะจัดส่งไฟล์ไปให้ แต่ปรากฏว่าแทบจะทุกคนก็ต้องย้อนกลับมาถามผมอีกทุกทีว่าจะใช้งานมันยังไง ... แบบนี้น่ะผมเงียบและไม่ตอบกลับเลย เพราะแสดงว่าเขา (หรือเธอ) ยังไม่มีความพร้อมพอที่จะรันงานข้ามเครื่องได้ และยิ่งโดยเฉพาะพวกที่ส่งเมล์มาหาผม เพื่อต้องการให้ผมเขียนโปรแกรมเป็นโมดูลให้ ... ฝันเปียกตอนกลางวันไปเหอะ ผมไม่ได้ว่างงานขนาดนั้นหรอกครับ ... พี่น้อง ...
เอาล่ะครับ ... มาเข้าเรื่องของ Initialize File ซึ่งมันก็คือ Text File ธรรมดาๆนี่เองแหละครับ โดยไฟล์เหล่านี้จะมีนามสกุลเป็น INI ซึ่งถูกใช้มานมนานแล้วตั้งแต่ยุค DOS, MS Wndows 3.0/3.11 (Work Group) มาเรื่อยๆจนถึงปัจจุบันนี้ แต่มันก็ค่อยๆลดบทบาทลงไปเนื่องจากถูกเอกสาร XML (eXtensive Markup Language) เข้ามาแทนที่มันไปแล้วครับ (สำหรับผมก็ย้ายไปใช้ XML เป็นที่เรียบร้อยแล้ว เพราะมันง่าย และ ยืดหยุ่นกว่า) ... ไฟล์ INI นี้มักจะจัดเก็บข้อมูล ข่าวสาร การตั้งค่าระบบที่สำคัญๆเอาไว้ เพื่อหลีกเลี่ยงการเขียนโค้ดโปรแกรมที่ยุ่งยาก และเพื่อให้ง่ายต่อการปรับแต่งระบบ
    โดยที่ INI File จะมีส่วนสำคัญ 3 ส่วน ดังนี้คือ
  1. Section ส่วนของชื่อที่ปิดด้วยเครื่องหมาย Bracket [] ... เพื่อตั้งชื่อเป็นกลุ่มข้อมูล
  2. Key เป็นชื่อเฉพาะที่มีค่าไม่ซ้ำกัน หรือ ก็คือตัวแปรดีๆนี่เองแหละครับ
  3. Value เป็นค่าที่ถูกกำหนดให้กับ Key เพื่อใช้ในการอ่าน และ เขียนเข้าไปใน INI File

ตัวอย่างของไฟล์ INI

สำหรับบทความชิ้นนี้ ผมจะอธิบายถึงวิธีการนำไปใช้งานได้อย่างจริงๆไม่มีกั๊ก หรือ ปิดบังแต่อย่างใด ดังนั้นผมจะไม่ขออธิบายถึงกระบวนการอ่านและเขียนข้อมูลลงไฟล์ INI ... จึงขอยืมโมดูลการอ่าน และ เขียน INI File จากของต่างประเทศมาใช้งานแล้วกันครับ โดยให้เครดิตกับเจ้าของเขาน่ะครับ ... คุณ Bernie Madigan ซึ่งสามารถดาวน์โหลดจาก FreeVBCode ... ดังนั้นผมจะใช้งานโมดูลนี้ตามต้นฉบับเป๊ะๆ โดยที่ยังไม่เกิดการ Modified ด้วยน้ำมือของผมแต่ประการใด อันเป็นการให้เกียรติแก่ผู้เขียนเขาด้วยน่ะครับกระผม ...แต่ก็อย่างว่าแหละโมดูลนี้มันยังมีข้อบกพร่องอยู่บ้าง ... ลองค้นหาดูและแก้ไขเพิ่มเติมเอาแล้วกันน่ะครับ ... พี่น้อง ... เพราะให้โค้ดมาอย่างนี้พี่น้องก็เอาไปใช้งานจริงๆได้แล้วแหละครับ
เริ่มต้นกระบวนการทำงาน

Project --> References ...


Project --> Components ...


Design Time


Run Time
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6

Option Explicit

Private Sub cmdOpenDB_Click()
'On Error Resume Next
On Error GoTo ErrHandler
Dim oMdbFile As String
    ' เปิดไฟล์ฐานข้อมูล
    oMdbFile = Trim(txtSelectMDB.Text)
    dlgOpenDB.FileName = ""
    dlgOpenDB.CancelError = True ' ไม่สนใจ Error ที่เกิดขึ้น
    dlgOpenDB.InitDir = App.Path    ' เลือกตำแหน่งปัจจุบันของ Project
    dlgOpenDB.DialogTitle = "เลือกตำแหน่งไฟล์ Microsoft Access" ' ตั้งค่า Title ของ Dialog
    dlgOpenDB.Filter = "Microsoft Access (*.mdb) | *.mdb" ' แสดงผลเฉพาะไฟล์ MDB
    dlgOpenDB.ShowOpen
    dlgOpenDB.DefaultExt = "*.mdb" ' ตั้งค่า MS Access (MDB) เป็นค่าเริ่มต้น
    
    oMdbFile = dlgOpenDB.FileName
    If oMdbFile = "" Then Exit Sub
    txtSelectMDB.Text = oMdbFile

ExitProc:
    Exit Sub

ErrHandler:
    ' หากไม่เท่ากับ 32755 ... คือหมายเลข Error 32755 นี้ คือ การกดปุ่ม Cancel น่ะครับ
    ' พูดง่ายๆ ผมไม่สนใจการเกิด Error นี้น่ะครับ ... แต่ Error อื่นๆ จะคอยดักไว้อีกที
    If Err.Number <> 32755 Then
        MsgBox "Error: " & Err.Number & vbCrLf & Err.Description
        ' Resume ExitProc
    End If
    ' ================================================================
    ' แต่อันที่จริงน่ะครับ ต้องพิจารณาการใช้งาน Resume ในแต่ละจุดที่เกิด Error เอาไว้ด้วยก็ดีครับ
    ' Resume ExitProc ... ไอ้นี่เด้งไปที่ Label : ExitProc เพื่อออกจากโปรแกรมย่อย
    ' Resume Next ... ไอ้นี่เด้งไปทำงานต่อจากจุดที่เกิด Error เลย ... ย้ำครับว่าต่อจากจุดที่เกิด Error
    ' การใช้ Label, Resume ร่วมกับ Exit Sub ในการดักจับ Trap Error มีความจำเป็นอย่างมากใน VB6
    ' ================================================================
End Sub

Private Sub cmdSave_Click()
    
    ' แม้ว่ามันไม่ใช่งานซ้ำซ้อนก็ตามที ... ก็ควรพยายามหัดเขียนให้เป็นส่วนของโปรแกรมย่อยไว้ด้วยก็ดีครับ
    ' จะได้คุ้นเคยเอาไว้ก่อนที่จะย้ายไป VB.NET
    ' ตรวจสอบค่าใน TextBox ต้องไม่เป็นค่าว่าง ... และทำการบันทึกข้อมูลลงใน Initial File (Employee.INI)
    If Trim$(txtSelectMDB.Text) <> "" Or Len(Trim$(txtSelectMDB.Text)) > 0 Then Call WriteINI
    
    MsgBox "ตำแหน่งไฟล์ข้อมูล:" & vbCrLf & txtSelectMDB.Text, vbOKOnly + vbInformation, "รายงานสถานะ"
    'Unload Me
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    ' จะใช้ส่วนนี้ได้ต้องตั้งค่าคุณสมบัติ (Properties) ของ Form
    ' KeyPreview = True ... ก่อนน่ะครับ
    Select Case KeyCode
        Case vbKeyF1: MsgBox "No help now."
        Case vbKeyF8: cmdSave_Click
        Case vbKeyEscape: Unload Me
    End Select
End Sub

Private Sub Form_Load()
    txtSelectMDB.Text = ""

    ' เรียกไปยังฟังค์ชั่นการอ่านค่าเริ่มต้น ... Initialize (ReadINI)
    txtSelectMDB.Text = ReadINI
    
    lblDescription.Caption = "การกำหนดตำแหน่งที่เก็บของไฟล์ฐานข้อมูลสำหรับโปรแกรมนี้ " & _
                        "มีจุดประสงค์เพื่อให้ระบบสามารถใช้งานได้ในแบบหลายผู้ใช้งาน (Multiuser) หรือ " & _
                        "สามารถมองเห็นข้อมูลข้ามเครื่องกันได้ในระบบเครือข่าย (Local Area Network) เดียวกัน."
End Sub

Employee.ini
' ส่วนที่ต้องนำมาใช้งาน ... และต้องนำไปใช้งาน Function ReadINI() As String ' Return ค่า String กลับ ' หาก Return ค่ากลับมาจาก ReadIniValue เป็นค่าว่าง ... ก็ให้ใส่ Path ปัจจุบัน และ ชื่อไฟล์ MS Access เข้ามาเลย ' ส่วนแรก คือ INI Path เช่น C:\ProjectVB\Employee\Employee.ini ... หรือ Value ให้กับ Key ' ส่วนที่ 2 คือ Section ในที่นี้ใช้ Default ' และส่วนสุดท้าย คือ Key ในที่นี้ คือ DataBaseFile If ReadIniValue(App.Path & "\Employee.ini", "Default", "DataBaseFile") = "" Then WriteIniValue App.Path & "\Employee.ini", "Default", "DataBaseFile", App.Path & "\Employee.mdb" Else ReadINI = ReadIniValue(App.Path & "\Employee.ini", "Default", "DataBaseFile") End If End Function ' ส่วนนี้ผมทำเป็นโปรแกรมย่อย (Sub Program) ... เพราะมันไม่มีการ Return ค่ากลับ ' จะต่างจาก ReadINI ที่จะต้องมีการ Return ค่ากลับ Sub WriteINI() ' บันทึกค่าจาก TextBox เข้าสู่ไฟล์ INI ... เพื่อกำหนด Path ให้กับไฟล์ฐานข้อมูล WriteIniValue App.Path & "\Employee.ini", "Default", "DataBaseFile", txtSelectMDB.Text End Sub
จาก ณ จุดนี้ ... จะเห็นได้ว่าเราแทบไม่ต้องไปยุ่งเกี่ยวอะไรกับโมดูล INIWrite (โปรแกรมย่อย WriteIniValue) และ INIRead (โปรแกรมย่อย ReadIniValue) ที่ผู้เขียนเขาทำเอาไว้เลยครับ ... พี่น้อง ... เรามีหน้าที่เพียงแต่ดึงฟังค์ชั่นที่เขาทำเอาไว้แล้วมาใช้งานเท่านั้นเอง ... และผมเองก็ทราบดีว่าหลายๆคนก็คงจะติดขัดตรงที่ไม่สามารถดึงประโยชน์ของมันออกไปใช้งานได้เลย ... บทความนี้จึงได้เกิดขึ้นมาเพื่อชี้ช่องรวย เอ๊ย ชี้ทางสว่างให้กับพี่น้องไงล่ะครับ ...
การนำไปใช้งานร่วมกับโมดูลในการเปิดฐานข้อมูล
ทีนี้ก็งัดงานเดิมของผมออกมาดูแหละครับ ซึ่งเป็นโมดูล (หากิน) ในการเปิดฐานข้อมูล (OpenDataBase) นั่นยังไงล่ะครับ ... มันต้องมีการเติมแต่งโค้ดเข้าไปใหม่ด้วย มันถึงจะ Work ...

Option Explicit

Global ConnDB As New ADODB.Connection
' =============================================================
' หมายเหตุ: ... พี่น้องครับ พยายามลดตัวแปรในการเชื่อมต่อตารางข้อมูลไว้บ้างก็ดีน่ะครับ
' ไม่ใช่เล่นแบบประกาศตัวแปร Object RecordSet เอาหมดกันแทบทุกๆตาราง ... เฮ้อ ...
' ตั้งแต่ผมเขียนโปรแกรมด้วย VB6 มา ผมใช้ตัวแปร RecordSet ไม่เกิน 3 ตัวสักครั้งเลย
' Global RS As New ADODB.Recordset   ' เราให้เป็นตัวหลัก
' Global DS As New ADODB.Recordset   ' กำหนดให้เป็นตัวรอง
' Global Statement As String
' Global SQLStmt As String
' =============================================================

' ส่วนแก้ไขจากของเดิมๆ ... ที่ผมเคยให้โค้ดไปตั้งแต่ปีมะโว้แล้ว
Public Sub OpenDataBase()
On Error GoTo Err_Handler
Dim DB_File As String

    ' อ่านตำแหน่งของไฟล์ฐานข้อมูลเข้ามาก่อนด้วย ReadIniValue
    DB_File = ReadIniValue(App.Path & "\Employee.ini", "Default", "DataBaseFile")
    
    ' หากไม่พบข้อมูลที่กำหนดไว้ ให้สร้าง Section, Key และ Value ขึ้นมาใหม่ด้วย WriteIniValue เมื่อ
    ' Section = [Default] ... ใส่เครื่องหมาย Bracket [ ... ] เอาไว้ด้วย
    ' Key = DatabaseFile
    ' Value = ตำแหน่งไฟล์ MS Access
    If DB_File = "" Then
        WriteIniValue App.Path & "\Employee.ini", "Default", "DataBaseFile", App.Path & "\Employee.mdb"
        ' ส่งค่าให้กับตัวแปร DB_File
        DB_File = ReadIniValue(App.Path & "\Employee.ini", "Default", "DataBaseFile")
    End If
    ' เปิดการเชื่อมต่อฐานข้อมูล
    Set ConnDB = New ADODB.Connection
    ConnDB.ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & DB_File & ";" & _
        "Persist Security Info=False;"
    ConnDB.Open

ExitProc:
    Exit Sub
    
Err_Handler:
Error ในกรณีที่หาไฟล์ไม่เจอ ... และยังมีโอกาสเกิด Error กับระบบไฟล์ได้อีกเพียบ
ลองดัก หรือ Trap Error พื้นๆ ที่อาจจะเกิดขึ้น เอาเองด้วยน่ะครับ
' หาไฟล์ไม่เจอ ... If Err.Number = -2147467259 Then MsgBox "Open Database Error : " & Err.Number & vbCrLf & _ "ไม่พบไฟล์ข้อมูล : " & Mid$(Err.Description, 21, Len(Err.Description)) & vbCrLf & _ "กรุณานำไฟล์ข้อมูลไปเก็บไว้ในตำแหน่งที่คุณระบุด้วย.", vbCritical + vbOKOnly, "รายงานสถานะ" 'Resume ExitProc End Else MsgBox "Open Database Error : " & vbCrLf & Err.Number & " " & Err.Description Resume ExitProc End If End Sub
การนำไปใช้งาน
โดยเริ่มจาก ... การให้โปรแกรมทำการเปิดฐานข้อมูล หรือ เรียกโปรแกรมย่อย OpenDataBase ขึ้นมาก่อนตามปกตินั่นแหละครับ ซึ่งตัวติดตั้งก็ควรจะเอา Initial File นี้ไปด้วยพร้อมกับตั้งค่า Default ที่คุณคิดว่าจะเอาไปติดตั้งเอาไว้ก่อน เช่น C:\Program Files\Project\Employee.ini อ้อ ... แล้วก็อย่าลืมเอาไฟล์ฐานข้อมูลไปด้วยล่ะ จากนั้นส่วนที่กำหนดการตั้งค่าของฟอร์ม frmSetupMDBFile ก็ไปทำเป็นเมนูเพื่อเรียกใช้งานมันต่อไปไงล่ะครับ ... พี่น้อง
ตัวอย่างของการทำ Share Folder - จากเครื่องแม่ (Server- Windows XP)

การ Share Folder แบบง่ายๆ ไม่ต้องยุ่งยากในการตั้งสิทธิ (Rights) การเข้าถึงมากมายให้วุ่นวาย


ไปโฟลเดอร์ที่ต้องการแชร์ แล้วคลิ๊กเมาส์ขวา เลือก Sharing and Security


คลิ๊กเลือกการ Share และ ยอมให้เครื่องลูกสามารถเขียนข้อมูล หรือ บันทึกข้อมูลลงไฟล์ได้

ตัวอย่างของการทำ Map Network Drive - จากเครื่องลูก (Client)

การเข้าถึงเครื่องที่ทำหน้าที่เป็น Server ... หากรู้จักชื่อเครื่องอยู่แล้วก็คีย์ \\ตามด้วยชื่อ Server เลยครับ


คลิ๊กเมาส์ขวาเพื่อเลือกการ Map Network Drive


เลือก Drive ที่ว่างๆ ... เป็นการจำลองให้เห็นเสมือนว่ามี Hard Disk อีกตัวติดตั้งในเครื่องลูก
การ Reconnect at Logon หากไปคลิ๊กเครื่องหมายถูกให้ปรากฏ เวลา Boot เครื่องใหม่มันก็จะพยายามวิ่งหา Network Drive ทุกครั้งไปน่ะครับ


เมื่อกดปุ่ม Finish มันก็จะโผล่ Drive X ขึ้นมาอัตโนมัติ ... ก็เริ่มต้นกระบวนการทำงานได้


เปิดจากโปรแกรม แล้วคลิ๊กเลือกเปิดไฟล์ตรงปุ่ม cmdOpenDB


เสร็จสิ้นกระบวนการแล้วครับ ... พี่น้อง

ผมใช้เวลาในการเขียนโปรแกรมนี้ขึ้นมาไม่ถึง 30 นาที แต่พอมาทำเป็นบทความ เขียน Comment ต่างๆ และตัดรูปไว้เนี่ยใช้เวลาไปร่วมๆ 3 ชั่วโมง ซึ่งปกติแล้วผมจะพิมพ์ไปหยุดไปเรื่อยๆตามอารมณ์ศิลปินเดี่ยว แต่สำหรับบทความเรื่องนี้คลอดมันออกมารวดเดียวจนเป็นที่เรียบร้อย ... ซึ่งผมเองมั่นใจว่า ... มันคงจะโดนใจพ่อแม่พี่น้องทั้งหลายเป็นอย่างมากเลยทีเดียวเชียวแหละครับ ... 55555+ ... นี่คือความรู้สึกเบาๆ แต่สะใจในรสชาติของผมเองครับ อะไรที่ชาวบ้านชาวเมืองเขาไม่ใช้ ผมก็ชอบเอามาใช้ เช่น Active Report ไงล่ะ ... อะไรที่เขาไม่ทำกัน ผมก็มักจะเอามาทำ ... ก็บทความต่างๆของผมนี่แหละครับ ... เอิ๊กๆๆๆๆ ...
จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560