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

|
|
|
Visitors - Session views |       
7 ธันวาคม พ.ศ.2549 23 Users On-Line. |
|
Visitors - Page views |        1 กุมภาพันธ์ พ.ศ.2551 |
|
|
|
 |
|
การกำหนด Path ของไฟล์ฐานข้อมูลด้วยคำสั่ง GetSetting/SaveSetting |
Category »
VB 6/VB.Net โดย : Webmaster เมื่อ 30/6/2552 เวลา: 15:15 | (อ่าน : 16185) | การใช้คำสั่ง GetSetting และ SaveSetting จะไปเกี่ยวข้องกับค่าใน Windows Registry ในตำแหน่งดังนี้คือ My Computer\HKEY_CURRENT_USER\Software\VB and VBA Program Settings
โดยที่
GetSetting เป็นการอ่านค่าที่อยู่ใน Registry ตามค่า Key ที่เรากำหนด มีการส่งค่ากลับแบบ String
SaveSetting เป็นการบันทึกค่าลงใน Registry ตามค่า Key ที่เรากำหนด (ไม่มีการส่งค่ากลับ)
Start --> Run --> พิมพ์ regedit แล้วกด Enter เบาๆก็พอ ... 55555+
ซึ่งมันมีประโยชน์ไว้ใช้งานได้เยอะแยะมาก (มันก็อยู่ที่ติ่งไอเดียของแต่ละคนด้วยน่ะครับ ... 55555+) ดังนั้นอย่าช้าครับพี่น้อง มาลองดูตัวอย่างงานจริงๆ ของการนำมาใช้งาน เพื่อกำหนด Path ของไฟล์ฐานข้อมูล กันเลยดีกว่า ... HOW TO AND DO IT NOW
การออกแบบ (Design Time)
โปรแกรมทำงาน (Run - Time)
เลือกไฟล์ MS Access และตำแหน่งที่ต้องการ
แจ้งสถานะการทำงาน
เริ่มต้นกระบวนการทำงาน
Option Explicit
' ส่วนของการเลือกตำแหน่ง และ ไฟล์ข้อมูล (MS Access)
Private Sub cmdOpenDB_Click()
' ทำงานต่อไป โดยไม่สนใจ Error ที่เกิดขึ้น
'On Error Resume Next
' ส่วนนี้ต้องการดัก หรือ Trap Error ที่เกิดขึ้นครับ
' ซึ่งหากมี Error มันจะกระโดดไปทำงานที่ป้าย Label ErrHandler ทันที เพื่อแจ้งความผิดพลาด
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 ในแต่ละจุดที่เกิด Error เอาไว้ด้วยก็ดีครับ
' Resume ExitProc ... ไอ้นี่เด้งไปที่ Label : ExitProc เพื่อออกจากโปรแกรมย่อย
' Resume Next ... ไอ้นี่เด้งไปทำงานต่อจากจุดที่เกิด Error เลย ... ย้ำครับว่าต่อจากจุดที่เกิด Error
' การใช้ Label, Resume ร่วมกับ ExitSub ในการดักจับ หรือ Trap Error มีความจำเป็นอย่างมากใน VB
' ================================================================
End Sub
Private Sub cmdSave_Click()
' ตรวจสอบค่าใน TextBox ต้องไม่เป็นค่าว่าง ... และทำการบันทึกข้อมูลลงใน Registry ทันที
' ต้องส่งชื่อ Text Box Control (txtSelectMDB) ไปยังโปรแกรมย่อยด้วยน่ะครับ
If Trim$(txtSelectMDB.Text) <> "" Or Len(Trim$(txtSelectMDB.Text)) > 0 Then _
Call WriteLocation(txtSelectMDB)
MsgBox "ตำแหน่งไฟล์ข้อมูล:" & vbCrLf & txtSelectMDB.Text, vbOKOnly + vbInformation, "รายงานสถานะ"
'Unload Me
End
End Sub
Private Sub Form_Load()
txtSelectMDB.Text = ""
lblDescription.Caption = "การกำหนดตำแหน่งที่เก็บของไฟล์ฐานข้อมูลสำหรับโปรแกรมนี้ " & _
"มีจุดประสงค์เพื่อให้ระบบสามารถใช้งานได้ในแบบหลายผู้ใช้งาน (Multiuser) หรือ " & _
"สามารถมองเห็นข้อมูลข้ามเครื่องกันได้ในระบบเครือข่าย (Local Area Network) เดียวกัน."
' เรียกไปยังฟังค์ชั่นการอ่านค่าเริ่มต้น ... Initialize (ReadLocation)
txtSelectMDB.Text = ReadLocation
' ลองทดสอบเชื่อมต่อไฟล์ฐานข้อมูล
Call OpenDataBase
If ConnDB.State = adStateOpen Then
MsgBox "การเชื่อมต่อฐานข้อมูลสมบูรณ์เรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ"
Else
MsgBox "การเชื่อมต่อฐานข้อมูลสมบูรณ์ล้มเหลว.", vbOKOnly + vbInformation, "รายงานสถานะ"
End If
' เปิดแล้วปิดปั๊บ ... ทดสอบเฉยๆครับพี่น้อง
Call CloseDataBase
End Sub
|
ส่วนของ Module (BAS) หลายคนคงสงสัยว่า ทำไมต้องใช้งานโมดูล ... หลักๆ (ของผม) ก็คือ
ต้องการให้ทุกๆฟอร์มสามารถมองเห็น และ เรียกใช้งานตัวแปร หรือ โปรแกรมย่อยได้
ต้องนำมาใช้งานในแต่ละโปรเจคทำมาหากินบ่อยครั้งมาก ไม่นิยม Copy & Paste ดังนั้นควรแยกไฟล์โมดูลเหล่านี้ออกเป็นส่วนๆ เพื่อให้สะดวกต่อการเรียกไฟล์มาใช้งานได้ทันทีเลย เช่น ส่วนของฐานข้อมูล (โมดูลหากินของผมนี่แหละ) ส่วนของระบบ ส่วนของการควบคุมคีย์บอร์ด เมาส์ เป็นต้น
Option Explicit
' =============================================================
' เทคนิคการ Optimized (พยายามลดต้นทุนที่ใช้ ซึ่งมันก็จะเกิดกำไรเองนั่นแหละ)
' =============================================================
' การประกาศ และ กำหนดการเชื่อมต่อฐานข้อมูล ทำเพียงครั้งเดียวก็พอแล้วครับ
Global ConnDB As New ADODB.Connection
' หมายเหตุ: ... พี่น้องครับ พยายามลดตัวแปรในการเชื่อมต่อตารางข้อมูลไว้บ้างก็ดีน่ะครับ
' ไม่ใช่เล่นต้องมาประกาศเอาใหม่หมดทุกๆตาราง ... แบบตามตำรากันเป๊ะๆจังเลยน่ะ
' ตั้งแต่ผมเขียนโปรแกรมด้วย VB6 มา ผมใช้ตัวแปร RecordSet ไม่เกิน 3 ตัวสักงานเลย
' Global RS As New ADODB.Recordset ' เราให้เป็นตัวหลัก
' Global DS As New ADODB.Recordset ' กำหนดให้เป็นตัวรอง
' หรือประกาศแบบขำๆ ... Dim RS กะ Dim GRAMMY เอาเองน่ะครับ เอิ๊กๆๆๆๆ
' ส่วนนี้ก็สำหรับการทำ Query Statement ก็ประกาศไม่กี่ตัว ก็พอเหลือใช้แล้ว
' Global Statement As String
' Global SQLStmt As String
' =============================================================
' มาอีกแล้ว ... โมดูลหากิน 55555+
' ==================== การเชื่อมต่อฐานข้อมูล ==========================
Public Sub OpenDataBase()
On Error GoTo Err_Handler
Dim DB_File As String
' อ่านตำแหน่งของไฟล์ฐานข้อมูลเข้ามาก่อนด้วยโปรแกรมย่อย (ฟังค์ชั่น) ReadLocation
' ReadLocation จะส่งค่าตำแหน่งของไฟล์ข้อมูลกลับมาหา DB_File
DB_File = ReadLocation()
' เปิดการเชื่อมต่อฐานข้อมูล
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:
' หาไฟล์ไม่เจอ ...
If Err.Number = -2147467259 Then
' แปลความหมายเป็นภาษามนุษย์ให้กับผู้ใช้งานได้เข้าใจง่ายๆ
' อันที่จริงแล้ว กรณีนี้เราควรต้องเพิ่ม ADOX เข้ามาเพื่อช่วยในการสร้างไฟล์+ตารางข้อมูลเข้ามาใหม่
' โอกาสหน้าจะมาว่ากันต่อเรื่อง ADOX ครับ ... เพราะเรื่องมันยาว
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
Public Sub CloseDataBase()
' ตรวจสอบว่ามีการเชื่อมโยง - Connect ข้อมูลหรือไม่
If ConnDB.State = adStateOpen Then
ConnDB.Close
Set ConnDB = Nothing
End If
End Sub
' ส่วนของการอ่านค่าจาก Registry ... ส่งค่ากลับเป็นแบบ String
Public Function ReadLocation() As String
' ตำแหน่งของ Registry สำหรับการใช้งาน GetSetting/SaveSetting
' Start --> Run --> พิมพ์ regedit
' หาก Return ค่ากลับมาจาก GetSetting เป็นค่าว่าง ... ก็ให้ใส่ Path ปัจจุบัน และ ชื่อไฟล์ MS Access เข้ามาเลย
' ส่วนแรก คือ AppName ... ตั้งชื่อเป็น MyAppName
' ส่วนที่ 2 คือ Section ... ตั้งชื่อเป็น MySection
' และส่วนสุดท้าย คือ Key ... ตั้งชื่อเป็น MyKey - ส่วนนี้คือส่วนที่ใช้จัดเก็บตำแหน่งของไฟล์ข้อมูล (Value)
If GetSetting("MyAppName", "MySection", "MyKey") = "" Then
' ส่วนสุดท้ายจะเป็น Value หรือ ตำแหน่งของไฟล์ข้อมูลนั่นเอง
Call SaveSetting("MyAppName", "MySection", "MyKey", App.Path & "\Employee.mdb")
End If
' ส่งค่ากลับไปแบบ String
ReadLocation = GetSetting("MyAppName", "MySection", "MyKey")
End Function
' การบันทึกค่าลง Registry
' ต้องรับค่าชื่อ TextBox Control เข้ามาด้วย (ในที่นี้คือ txtSelectMDB)
Public Sub WriteLocation(Ctrl As TextBox)
' บันทึกค่าจาก TextBox เข้าสู่ Registry ... เพื่อกำหนด Path ให้กับไฟล์ฐานข้อมูล
Call SaveSetting("MyAppName", "MySection", "MyKey", Ctrl)
End Sub
|
Conclusion: ลองสังเกตอีกอย่างด้วยน่ะครับ ตัวแปร ที่ผมต้องการให้เห็นหมดทุกๆส่วนในโปรเจคใดๆ ผมจะประกาศให้เป็นแบบ Global ส่วนพวกที่เป็นโปรแกรมย่อย ทั้ง Sub หรือ Function ผมจะให้เป็น Public ... และการส่งค่าพารามิเตอร์ทั้งในคำสั่ง GetSetting/SaveSetting ก็เป็นการกำหนดค่าแบบ String ธรรมดาๆนี่เอง ไม่ได้มีความสลับซับซ้อนอะไรเลยครับ ... พี่น้อง (อยู่ภายใต้เครื่องหมาย Double Quote "" นั่นเอง)
|
|