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

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

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

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

เรียนรู้ XML กับ Visual Basic 6.0 ภาค 5 (การ Login จากโปรแกรมไปยัง Web Server)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 27/12/2551 18:18:00
(อ่าน : 17662) 
ก็อย่างที่ได้จั่วหัวเอาไว้แหละครับ บทความชิ้นนี้มันเป็นการรวมญาติ รวมมิตรซ่ะจริงๆ เพราะประสานการทำงานกันระหว่าง VB6, ASP, XML และใช้ MS Access เพื่อเก็บข้อมูล (ก็คนมันแบบจับฉ่ายนี่ครับผม) ... บทความไม่ใช่เรื่องแปลกอะไรเลย เนื่องจากมีผู้ผลิตซอฟท์แวร์หลายรายก็ได้นำหลักการนี้มาใช้งานแล้ว แต่มันแปลกก็เพราะว่ามันสด ... เนื่องจากไม่มีใครเคยมานำเสนอให้พี่น้องได้รับชมกันในแบบ HOW TO AND DO IT นี่คือสไตล์ในการฝึกฝนของผมเอง ... จินตนาการที่อยู่กลางอากาศ แล้วเราจับมันมาปั้นเป็นชิ้นงาน ... เหอๆๆๆๆๆ บทความเรื่องนี้จะเป็นการนำเสนอให้เห็นถึงว่า เราสามารถเชื่อมโยงการทำงานระหว่าง Application Program เก๋าๆอย่าง VB6 โดยการส่งข้อมูลผ่านอินเทอร์เน็ตไปยัง Web Server จากนั้น Web Server ประมวลผลและสามารถส่งข้อมูลกลับมายังตัว Application ได้อย่างไร นอกจากนี้ยังจะชี้ให้เห็นถึงการใช้ VB6 เพื่อทำงานข้ามค่ายร่วมกันกับ PHP/MySQL ได้อีกด้วย เพราะ สาระสำคัญมัน คือ XML ... และแน่นอนเลยว่าจะหาอ่านที่ไหนในโลกนี้ไม่มีอีกแล้ว (ตามฟอร์ม ... 55555+)
    หลักการของท้องเรื่องก็มีอยู่ว่า
  1. โปรแกรม MS Visual Basic 6.0 เป็นตัวควบคุมหลัก โดยเริ่มจากการ Login เพื่อป้อน Username และ Password เข้าไป
  2. ส่งข้อมูลไป Web Server แบบ QueryString (หรือเรียกว่าแบบสายธารน้ำไหลนั่นแหละ ... เพราะมันมาเป็นชุด ... เอิ๊กๆๆๆๆ) เช่น
    • http://localhost/Application2Web/CheckUser.asp?Username=admin&password=adminpassword
    • ส่วนนี้ Username=admin&password=adminpassword คือ QueryString ครับ จะมีข้อมูลอยู่ 2 ชุด ซึ่งถูกแยกออกจากกันด้วยเครื่องหมาย &
  3. ใช้ ASP (หรือ PHP ก็ได้) แยกตัวแปร Username/Password ออกจาก QueryString
  4. ติดต่อกับฐานข้อมูล แล้วทดสอบว่าข้อมูลถูกต้องหรือไม่ (อันนี้ Access/MS SQL หรือ MySQL ทำได้หมด)
  5. ส่งข้อมูลที่ต้องการกลับมาในรูปแบบเอกสาร XML (ก็ไฟล์เดิมนั่นแหละ)
  6. โปรแกรม MS Visual Basic 6.0 รับค่าจากเอกสาร XML แล้วตรวจสอบค่าว่าเป็น True หรือ False ... เพื่อสร้างเหตุการณ์ในลำดับต่อไป ...
เรียนรู้ XML กับ Visual Basic 6.0 ภาค 1
เรียนรู้ XML กับ Visual Basic 6.0 ภาค 2
เรียนรู้ XML กับ Visual Basic 6.0 ภาค 3 (แปลงร่าง XML ให้กลายเป็น HTML)
เรียนรู้ XML กับ Visual Basic 6.0 ภาค 4 (แจกโค้ดโปรแกรมดูทีวีออนไลน์ VB6+XML)
แจกฟรี ... Source Code โปรแกรมดูทีวีออนไลน์ ด้วย VB.Net (2008) + XML ... วู้ย หยะแหยง DOT NET ... เหอๆๆๆๆ
ดาวน์โหลด 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
เริ่มต้นกระบวนการทำงาน

Project --> References ...
เลือก XML เวอร์ชั่นสูงที่สุดที่ผมมีอยู่

สามารถดาวน์โหลด Microsoft Core XML Services (MSXML) 6.0 ได้ที่นี่


Project --> Components ...
งานนี้ต้องใช้ Microsoft Internet Transfer Control (MSINET.OCX)


Design Time


Run Time


การตอบรับมาจาก Web Server กรณี True


การตอบรับมาจาก Web Server กรณี DTAC เอ๊ย ... False

มาดูโค้ดกันเถอะ ...

Option Explicit
Private CustomerName As String

' เหตุการณ์เมื่อพร้อมที่จะทำการเข้าสู่ระบบ (Login)
Private Sub cmdLogin_Click()
    ' ตรวจสอบค่าว่างเปล่าในการกรอกข้อมูลก่อน
    If Trim(txtUserName.Text) = "" Or Len(Trim(txtUserName.Text)) = 0 Then
        MsgBox "กรุณาป้อนชื่อผู้ใช้ (Username) ให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานความผิดพลาด"
        Exit Sub
    ElseIf Trim(txtPassword.Text) = "" Or Len(Trim(txtPassword.Text)) = 0 Then
        MsgBox "กรุณาป้อนรหัสผ่าน (Password) ให้เรียบร้อยก่อนด้วย.", vbOKOnly + vbExclamation, "รายงานความผิดพลาด"
        Exit Sub
    End If
    
    Dim xmlDoc As MSXML2.DOMDocument60
    Dim strXML As String    ' สำหรับข้อมูลแบบ XML
    Dim strURL As String    ' ระบุตำแหน่งของไฟล์ ASP Script พร้อมทั้ง QueryString ที่ส่งไป
    
    ' กำหนดตำแหน่งของการส่งค่าผ่านไปยัง ASP Script
    strURL = "http://localhost/Application2Web/CheckUser.asp?" & _
                    "Username=" + Trim(txtUserName.Text) + _
                    "&Password=" + Trim(txtPassword.Text)

    ' หรืออยากทดสอบใน Server จริงๆ ที่ www.g2gnet.com ก็ได้ครับผม
    'strURL = "http://www.g2gnet.com/ASP/CheckUser.asp?" & _
                    "Username=" + Trim(txtUserName.Text) + _
                    "&Password=" + Trim(txtPassword.Text)
    
    ' การส่งแบบ QueryString หรือหากเมื่อนำไปทดสอบกับ ASP Script ใน Explorer มันก็จะอยู่ในรูปแบบนี้
    ' http://localhost/Application2Web/CheckUser.asp?Username=admin&password=adminpassword
    
    ' ส่งผ่าน Inet1(Microsoft Internet Transfer Control) และ คืนค่ากลับมานำไปจับยัดไว้ใน strXML
    strXML = Inet1.OpenURL(strURL)
    ' ======================================================================
    ' ค่าที่ส่งกลับมาจะอยู่ในรูปแบบของ XML เป็นที่เรียบร้อยครับผม นั่นคือ strXML จะมีรูปแบบนี้ ...
    ' ลองสั่งด้วย Debug.Print strXML แล้วจะเห็นครับ
    ' <?xml version="1.0" encoding="Windows-874" ?>
    ' <checkuser>
    ' <user>
    ' <CustomerName>ผู้ดูแลระบบที่เคารพ</CustomerName>
    ' <status>True</status>
    ' </user>
    ' </checkuser>
    ' ======================================================================
    
    DoEvents
    
    Set xmlDoc = New MSXML2.DOMDocument60
    
    ' โหลดไฟล์ XML เข้าสู่ DOM
    If Not xmlDoc.loadXML(strXML) Then
        MsgBox "ขออภัย ... ไม่สามารถอ่านข้อมูลเอกสาร XML ได้.", vbOKOnly + vbInformation, "รายงานสถานะ"
        Exit Sub
    End If
    
    ' เรียกไปยังฟังค์ชั่น PopulateXML เพื่อรับค่ากลับมาตรวจสอบว่าเป็น True/False
    ' เงื่อนไขแรกเป็นจริง (True)
    If PopulateXML(xmlDoc) Then
        MsgBox "สวัสดีครับคุณ " & CustomerName & vbCrLf & _
                        "คุณมีสิทธิ์ในการใช้งานโปรแกรมได้ ... UHU.", vbOKOnly + vbInformation, "รายงานสถานะ"
    Else
        MsgBox "สวัสดีครับคุณ " & CustomerName & vbCrLf & _
                        "ขออภัยคุณไม่มีสิทธิ์ในการใช้งานโปรแกรมได้.", vbOKOnly + vbInformation, "รายงานสถานะ"
    End If
End Sub

' โปรแกรมย่อย (ฟังค์ชั่น) ในการแยกแยะข้อมูล (Parser) ออกจาก XML
' โปรดสังเกตว่าผมส่งค่ามาจาก DOM โดยตรง
Private Function PopulateXML(ByVal xmlUser As MSXML2.DOMDocument60) As Boolean

    Dim xmlElement As IXMLDOMElement
    ' ==================================================================
    ' การอ่านข้อมูล XML ที่เรารู้ว่ามันมีข้อมูลเพียงชุดเดียว ดังนั้นในกรณีนี้ไม่ต้องใช้ Loop แบบ For Each
    ' ==================================================================
    ' <?xml version="1.0" encoding="Windows-874" ?>
    ' <checkuser>
    ' <user>
    ' <CustomerName>ผู้ดูแลระบบที่เคารพ</CustomerName>
    ' <status>True</status>
    ' </user>
    ' </checkuser>
    
    ' อ่านค่าจาก Status Element และให้ส่งค่ากลับไปด้วย (ผ่านทางฟังค์ชั่น)
    ' เราสามารถระบุ Node และ Element ลงไปได้เลยครับ ... พี่น้อง
    ' ไล่มาจาก checkuser --> user --> status
    Set xmlElement = xmlUser.selectSingleNode("checkuser/user/status")
    If Not xmlElement Is Nothing Then
        ' ค่าที่ใช้ในการส่งกลับจะมีเพียง True หรือ False เพื่อนำไปทดสอบต่อไปว่า Username/Password ถูกต้องหรือไม่
        PopulateXML = xmlElement.Text
    End If
    
    ' กรณีที่มีเพียงแค่ 1 Statement (คำสั่ง) สามารถเขียนแบบไม่ต้องปิด End If ก็ได้ครับ
    'If Not xmlElement Is Nothing Then PopulateXML = xmlElement.Text
    
    ' อันนี้สำหรับรับค่าจาก CustomerName Element
    ' ไล่มาจาก checkuser --> user --> customername
    Set xmlElement = xmlUser.selectSingleNode("checkuser/user/CustomerName")
    ' CustomerName เป็นตัวแปรแบบ Private ที่มองเห็นได้ทั้งฟอร์ม frmLogin น่ะครับ
    If Not xmlElement Is Nothing Then CustomerName = xmlElement.Text
    
End Function

Private Sub Form_Load()
    ' ใส่ข้อมูลทดสอบครับ ... แบบว่าตอนทดสอบขี้เกียจมาป้อนข้อมูลหลายๆรอบ 55555+
    txtUserName.Text = "admin"
    txtPassword.Text = "adminpassword"
    

    Me.Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
    Me.Caption = "Application 2 Web Server - www.g2gnet.com"
End Sub

Private Sub cmdExit_Click()
    End
End Sub

' ฟังค์ชั่นที่ใช้ในการตรวจสอบการกดแป้นคีย์บอร์ดเพื่อให้รับเฉพาะค่า 0 - 9, a - z และ A - Z เท่านั้น
Public Function CheckAlphaNumeric(Index As Integer) As Integer
    Select Case Index
        ' กำหนดการรับค่าตัวเลข 0 - 9 (ASCII Code 48 - 57)
        ' กำหนดการรับค่าตัวอักษร A - Z (ASCII Code 65 - 90)
        ' กำหนดการรับค่าตัวอักษร a - z  (ASCII Code 97 - 122)
        Case 48 To 57, 65 To 90, 97 To 122
            CheckAlphaNumeric = Index
        Case 8
            ' Back Space
        Case 13
            ' Enter
        Case Else
            ' หากคีย์ที่กดมาไม่ตรงกับความต้องการ ให้ส่งกลับเป็น 0 หมายถึง ไม่มีการกดคีย์ใดๆเลย
            Index = 0
    End Select
    CheckAlphaNumeric = Index
End Function

' ตัวอย่างของการใช้งานในเหตุการณ์ KeyPress ของ Command Button
Private Sub txtUsername_KeyPress(KeyAscii As Integer)
    If KeyAscii = vbKeyReturn Then
        SendKeys "{TAB}"
        KeyAscii = 0
    Else
        KeyAscii = CheckAlphaNumeric(KeyAscii)
    End If
End Sub


มาดู ASP Script สำหรับตรวจสอบข้อมูล และ สร้าง XML แบบอนุบาลแมวเหมียวกัน
ไม่จำเป็นต้องเป็น ASP/Access/MS SQL ก็ได้น่ะครับ ... สามารถร่วมจอยงานกับ PHP/MySQL ก็ได้สบายๆเลยครับพี่น้อง
เพราะสิ่งที่เราต้องการมันคือ ... XML (eXtensive Markup Language)


<%
Dim Cn
' ประกาศได้ประกาศดีเจ้าตัวแปร RS เนี่ย ... 
' ทำไมเราไม่ประกาศเป็นตัวแปร GMM Grammy บ้างเนอะ
' หรือว่าประกาศ Dim GMM แล้วมันจะมี Bug หรือเปล่าน้อ ... 55555+
Dim RS Dim Statement Dim UserName Dim Password Dim CustomerName Dim Permission ' ตอนรับค่าเข้ามา เราจะแยกข้อมูลแต่ละชุดออกจากกันด้วย Request.QueryString ' http://localhost/Application2Web/CheckUser.asp?Username=admin&password=adminpassword ' ข้อมูลแต่ละชุดจะถูกแยกออกจากกันด้วยเครื่องหมาย & Username = Request.QueryString("Username") Password = Request.QueryString("Password") ' Script ในการเชื่อมต่อกับฐานข้อมูล MS Access ' เช่น c:\InetPub\wwwroot\Application2Web\ตำแหน่ง ASP Script อยู่ที่นี่ ' เช่น c:\InetPub\wwwroot\Application2Web\DB\ตำแหน่งไฟล์ฐานข้อมูลอยู่ที่นี่ StrCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("DB/WebData.mdb") & ";" Set Cn = Server.CreateObject("ADODB.Connection") Cn.Open strCon ' Script ในการเชื่อมต่อกับตารางข้อมูล MS Access Set RS = Server.CreateObject("ADODB.Recordset") Statement = "SELECT * FROM Users WHERE Username = " & "'" & Trim(UserName) & "'" Statement = Statement & " AND " Statement = Statement & " Password = " & "'" & Trim(Password) & "'" ' การกำหนด CursorLocation ' adUseServer = 2 หากเราไม่กำหนดจะถือว่าเป็นค่าเริ่มต้น (Default) ' adUseClient = 3 RS.CursorLocation = 3 ' adUseClient ' การกำหนด CursorType ' adOpenForwardOnly = 0 *** ใช้สำหรับการค้นหาข้อมูล หรือ อ่านข้อมูลเดินหน้าอย่างเดียว *** ' adOpenKeyset = 1 *** ใช้สำหรับการบันทึกข้อมูล *** ' adOpenDynamic = 2 ' adOpenStatic = 3 RS.CursorType = 0 ' adOpenForwardOnly ' การกำหนด LockType ' adLockReadOnly = 1 *** ปกติใช้ร่วมกับ adOpenForwardOnly หรือ อ่านข้อมูลเพียงอย่างเดียว ' adLockPessimistic = 2 ' adLockOptimistic = 3 *** ปกติใช้ร่วมกับ adOpenKeySet ' adLockBatchOptimistic = 4 RS.LockType = 1 ' adLockReadOnly RS.Open Statement, Cn ' สามารถทดสอบการทำงานก่อนโดยลองเปิด Browser ขึ้นมา และใช้รูปแบบตามด้านล่างนี้ครับ ' http://localhost/Application2Web/CheckUser.asp?Username=admin&password=adminpassword if RS.RecordCount <= 0 then Permission = False Customername = "อย่ามามั่วนิ่มกับโปรแกรมพันล้านของผม ... 55555+" else Permission = True CustomerName = RS("CustomerName") end if RS.Close Set RS = Nothing Cn.Close Set Cn = Nothing ' สิ่งสำคัญในงานชิ้นนี้ ... ' ส่งค่าคืนกลับไปในรูปแบบของ XML (Text ดีๆนี่เองแต่มี Tag เปิดหัว ปิดหาง 55555+) Response.ContentType = "text/xml" Response.Write "<?xml version=""1.0"" encoding=""Windows-874"" ?>" & vbCrlf Response.Write "<checkuser>" & vbCrlf Response.Write "<user>" & vbCrlf Response.Write "<CustomerName>" & "" & CustomerName & "</CustomerName>" & vbCrlf Response.Write "<status>" & Permission & "</status>" & vbCrlf Response.Write "</user>" & vbCrlf Response.Write "</checkuser>" & vbCrlf %>
Conclusion:
แค่นี้พี่น้องทั้งหลายก็ได้เห็นแสนยานุภาพของ MS Visual Basic 6.0 กันแล้วใช่มั้ยครับ นี่แค่เหตุผลเสี้ยวหนึ่งเท่านั้นเองที่ "ทำไมผมยังไม่ยอมย้ายระบบไป .NET สักที" ผมเองยังไม่ได้กล่าวถึงเรื่องของสบู่ เอ๊ย SOAP API เลยน่ะครับ แต่แค่นี้ก็สามารถนำไปประยุกต์ใช้งานได้อย่างหลากหลายมากแล้วครับ อาทิเช่น โปรแกรมเช่าใช้รายเดือน (ไม่ต้องลงทะเบียนอะไรในโปรแกรมเลย) โปรแกรมการสุ่มข้อสอบ หรือ ทำข้อสอบออนไลน์ โปรแกรมดูทีวี (ที่ผมทำ) และอื่นๆเยอะแยะมากมาย ... หรือจะทำโปรแกรม Logging File ไว้เก็บข้อมูลการใช้งานอินเทอร์เน็ตก็ยังไหว (รำคาญพวกชอบอ้าง พรบ คอมพิวเตอร์ ปี 50 ซ่ะจริงๆ ... เดี๋ยวว่างๆเมื่อไหร่ ผมจะเขียนโค้ดมาแจกเลยเป็นไง เพราะรอผลงานของ ซิป้า การ์ตูน (SIPA-Cartoon) คงไม่ไหวหรอก 55555+) ...

สุดท้ายนี้ก็ขอส่งความสุขปีใหม่ 2552 แด่พี่น้องคนไทยทุกๆท่าน จงมีแต่ความสุข ความเจริญ และ รักใคร่ สมานสามัคคีกันตลอดไป ด้วยเทอญ
จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560