ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...

|
|
|
Visitors - Session views |       
7 ธันวาคม พ.ศ.2549 134 Users On-Line. |
|
Visitors - Page views |        1 กุมภาพันธ์ พ.ศ.2551 |
|
|
|
 |
|
การกำหนด 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 ส่วน ดังนี้คือ
- Section ส่วนของชื่อที่ปิดด้วยเครื่องหมาย Bracket [] ... เพื่อตั้งชื่อเป็นกลุ่มข้อมูล
- Key เป็นชื่อเฉพาะที่มีค่าไม่ซ้ำกัน หรือ ก็คือตัวแปรดีๆนี่เองแหละครับ
- Value เป็นค่าที่ถูกกำหนดให้กับ Key เพื่อใช้ในการอ่าน และ เขียนเข้าไปใน INI File
 ตัวอย่างของไฟล์ INI
สำหรับบทความชิ้นนี้ ผมจะอธิบายถึงวิธีการนำไปใช้งานได้อย่างจริงๆไม่มีกั๊ก หรือ ปิดบังแต่อย่างใด ดังนั้นผมจะไม่ขออธิบายถึงกระบวนการอ่านและเขียนข้อมูลลงไฟล์ INI ... จึงขอยืมโมดูลการอ่าน และ เขียน INI File จากของต่างประเทศมาใช้งานแล้วกันครับ โดยให้เครดิตกับเจ้าของเขาน่ะครับ ... คุณ Bernie Madigan ซึ่งสามารถดาวน์โหลดจาก FreeVBCode ... ดังนั้นผมจะใช้งานโมดูลนี้ตามต้นฉบับเป๊ะๆ โดยที่ยังไม่เกิดการ Modified ด้วยน้ำมือของผมแต่ประการใด อันเป็นการให้เกียรติแก่ผู้เขียนเขาด้วยน่ะครับกระผม ...แต่ก็อย่างว่าแหละโมดูลนี้มันยังมีข้อบกพร่องอยู่บ้าง ... ลองค้นหาดูและแก้ไขเพิ่มเติมเอาแล้วกันน่ะครับ ... พี่น้อง ... เพราะให้โค้ดมาอย่างนี้พี่น้องก็เอาไปใช้งานจริงๆได้แล้วแหละครับ เริ่มต้นกระบวนการทำงาน
Project --> References ...
Project --> Components ...
Design Time
Run Time
 |
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 ไงล่ะ ... อะไรที่เขาไม่ทำกัน ผมก็มักจะเอามาทำ ... ก็บทความต่างๆของผมนี่แหละครับ ... เอิ๊กๆๆๆๆ ...
|
|