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

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

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

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

การกำหนด Path ของไฟล์ฐานข้อมูลด้วยคำสั่ง GetSetting/SaveSetting

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 30/6/2552   เวลา: 15:15
(อ่าน : 13619) 
การใช้คำสั่ง 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
    ดาวน์โหลด
    ดาวน์โหลด 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
    ข้อมูลเพิ่มเติม
    SaveSetting Method - ไมโครซอฟท์
    การกำหนด Path ของไฟล์ฐานข้อมูลด้วย INI (Initialized File) โดยที่ไม่ต้องเรียกใช้งาน API
    เรื่องของโปรแกรมย่อย (อีกที) ... Sub Program, Routine, Procedure หรือ Function
  • การออกแบบ (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 "" นั่นเอง)

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