โดยทั่วๆไปเมื่อเราทดสอบการเชื่อมต่อฐานข้อมูล 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\GuestServer คือ ชื่อ 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+
|