การเชื่อมต่อระบบฐานข้อมูล MS SQL Server (ภาคปฏิบัติ)

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 31/5/2551 12:12:00
(อ่าน : 82782) 
โดยทั่วๆไปเมื่อเราทดสอบการเชื่อมต่อฐานข้อมูล MS SQL Server อยู่ที่เครื่องที่เราใช้งานเอง (Local Machine) ก็มักจะไม่ค่อยพบปัญหาเท่าใดนัก แต่พอข้ามเครื่อง (Network) ทีไรก็จะเจอปัญหาทุกทีซิน่า ซึ่งส่วนใหญ่ก็น่าจะเป็นเรื่องของ Security ซ่ะมากกว่า ... แต่บางเรื่องน่ะครับพี่น้อง เราก็ไม่สามารถกางตำรา บ้าทฤษฎี แล้วนำมาอธิบายได้หรอก ... 55555+ ... เพราะเรื่องราวแบบนี้มันหามาได้ด้วยคำว่า "ประสบการณ์" คือ ทำบ่อยๆไปเดี๋ยวก็รู้เองแหละ ...
ผมเชื่อว่ามีอีกหลายๆคนที่ไม่เคยรู้มาก่อนว่า การใช้งานโปรแกรม MS Visual basic 6 ไม่จำเป็นต้องมีฟอร์มเลยก็ได้น่ะครับ โดยที่เราสามารถสั่งให้ Startup object ได้เลย ที่ Sub Main ซึ่งเจ้า Sub Main ที่ว่ามานี้ โดยปกติเราจะนำไปวางไว้ที่ Module (นามสกุล .BAS)

Add New Module


Startup object


' การออกแบบโปรแกรมให้มีโครงสร้าง จะช่วยลดปัญหาลงไปได้เยอะ 
' พร้อมๆกับทำให้โปรแกรมเมอร์อย่างผมมีเวลาไปเล่นเกมส์ได้อีก เหอๆๆๆๆ ...
' การทดสอบกับเครื่อง Local Machine ' โค้ดเหล่านี้ถูกจัดเก็บใน Module ด้วยน่ะครับ ... พี่น้อง Option Explicit Global ConnDB As New ADODB.Connection ' พยายามลดการใช้งานตัวแปรซ้ำซ้อนครับ ... เพื่อแก้ปัญหาภาวะเครื่องร้อน ... เอิ๊กๆๆๆๆๆ 'Global RS As New ADODB.Recordset 'Global DS As New ADODB.Recordset 'Global RstData As New ADODB.Recordset ' ใช้ในรายงาน 'Global Statement As String 'Global SQLStmt As String ' Sub Main() ' ทดสอบการเชื่อมต่อฐานข้อมูล Call OpenDataBase ' เปิดแล้วก็ปิด ... เพราะต้องการแค่ทดสอบ Call CloseDataBase End Sub Public Sub OpenDataBase() On Error GoTo Err_Handler ' Open a connection. Set ConnDB = New ADODB.Connection ' จัดรูปแบบให้สวยงาม อ่านง่ายๆ ' ใช้ฐานข้อมูลตัวอย่าง NorthWind เป็นตัวทดสอบ ConnDB.ConnectionString = _ " Provider=SQLOLEDB.1;" & _ " Integrated Security=SSPI;" & _ " Server=(local);" & _ " Initial Catalog=NorthWind;" & _ " User ID=;" & _ " Password=;" ConnDB.Open MsgBox "การเชื่อมต่อกับฐานข้อมูลเรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ" ExitProc: Exit Sub Err_Handler: MsgBox "Open Database Error : " & vbCrLf & Err.Number & " " & Err.Description Resume End Sub Public Sub CloseDataBase() ' ตรวจสอบว่ามีการเชื่อมโยง - Connect ข้อมูลหรือไม่ If ConnDB.State = adStateOpen Then ConnDB.Close Set ConnDB = Nothing End If End Sub

สามารถเชื่อมต่อได้เรียบร้อย ... ตราเด็กสมบูรณ์

' การทดสอบกับระบบเครือข่ายโดยใช้ MS Windows XP เป็น Server
' ก็แค่เปลี่ยนชื่อ Server ที่เราต้องการจะติดต่อกับมัน ... เท่านั้นเอง
Public Sub OpenDataBase() On Error GoTo Err_Handler Set ConnDB = New ADODB.Connection ConnDB.ConnectionString = _ " Provider=SQLOLEDB.1;" & _ " Integrated Security=SSPI;" & _ " Server=Server-XP;" & _ " Initial Catalog=NorthWind;" & _ " User ID=;" & _ " Password=;" ConnDB.Open MsgBox "การเชื่อมต่อกับฐานข้อมูลเรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ" ExitProc: Exit Sub Err_Handler: MsgBox "Open Database Error : " & vbCrLf & Err.Number & " " & Err.Description Resume End Sub

เกิด Error ว่า Login failed for user SERVER\Guest
Server คือ ชื่อ Server ที่คุณทำการติดต่อกับมันน่ะครับ
การแก้ปัญหาก็สุดแสนจะง่ายดายมากๆ ...

เปิด SQL Server Enterprise Manager
(จากเครื่องที่เป็น Server น่ะครับ ... ไม่ใช่ Local Machine)

เปลี่ยนจาก Windows only ไปเป็นแบบ Mixed Mode หรือ SQL Server and Windows แทนครับ
จากนั้นให้ Restart Server ใหม่อีกรอบ
และไม่ว่าคุณจะแก้กลับไปเป็นโหมด Windows only ใหม่ก็ตามที Error นี้ก็จะไม่เกิดขึ้นอีกเลย
ผมหาทฤษฎีมาอธิบายไม่ได้ครับ ... พี่น้อง

หรือ เราสามารถบังคับให้ปรากฏ Option หรือ ทางเลือก เพื่อที่จะเลือกเอา Server กับฐานข้อมูลที่ต้องการมาใช้งานได้ดังนี้ ...

' การใช้คุณสมบัติ adPromptAlways เพื่อสร้างทางเลือกของการเชื่อมต่อฐานข้อมูล
Public Sub OpenDataBase()
On Error GoTo Err_Handler
    Set ConnDB = New ADODB.Connection
    ConnDB.ConnectionString = _
        " Provider=SQLOLEDB.1;" & _
        " Integrated Security=SSPI;" & _
        " Server=Server-XP;" & _
        " Initial Catalog=NorthWind;" & _
        " User ID=;" & _
        " Password=;"

    ConnDB.Properties("Prompt") = adPromptAlways
    ConnDB.Open
    ' MsgBox "การเชื่อมต่อกับฐานข้อมูลเรียบร้อย.", vbOKOnly + vbInformation, "รายงานสถานะ"

ExitProc:
    Exit Sub

Err_Handler:
    Select Case Err.Number
        ' ดัก Trap Error ของการกดปุ่ม Cancel
        Case -2147217842
            ' จากนั้นสั่งให้ Resume หรือ ทำงานต่อไปได้เลย
            Resume
        
        Case Else
            MsgBox "Open Database Error : " & vbCrLf & Err.Number & " " & Err.Description
            Resume
    End Select
End Sub

การใช้คุณสมบัติ adPromptAlways เพื่อเลือกการเชื่อมต่อ
Conclusion:
ตอนนี้ก็ขอทดสอบกับ Windows XP ไปพลางๆก่อนน่ะครับผม รอบหน้าค่อยมาว่ากันอีกทีสำหรับการเข้าถึงข้อมูลบน Server 2003 Data Center และ MS SQL Server 2005 เพราะช่วงนี้ยังไม่มีงานระดับนี้เข้ามา ก็เลยยังไม่ได้ทำการติดตั้ง OS ในเครื่อง Server ที่ผมใช้ทดสอบเลยครับพี่น้อง ... 55555+