วันนี้ ขึ้นไปตรวจสอบ งานเล็กน้อย (เขียนด้วย VB6 เขียนเองกับมือ) แล้วดันลืม Password สำหรับ Admin (ตั้งเองกับมือ) เลยต้องไปถาม คนที่มีหน้าที่ตรงนี้เลยตรง ก็ได้คำตอบ

แล้วไอ โปรแกรมที่ว่า เขียนด้วย VB 6 และใช้ Database เป็น MySQL ซึ่งรันอยู่บน Linux Server ซึ่งตอนนี้อยากจะแก้ไขให้สามารถเพิ่ม ลบ แก้ไข Admin ได้ เลยมาทำ

ซึ่งทำให้นึกถึง GOTOKNOW ซึ่ง ผมมีโปรแกรมที่จะเขียนเรื่องนี้อยู่ แต่ กะว่าจะเขียน PHP VS PostgreSQL ก่อน เลย เปลี่ยนใจ ลัดคิว มาเขียน VB 6.0 VS MySQL ก่อน

ก่อนอื่น ต้องเตียมความพร้อมก่อน โดยการลง MySQL OBDC ซึ่งสามารถ Download ได้ Free จาก http://www.mysql.com เจ้าเก่า

ต่อมาก็ วิ่งหนีสิ เรื่องอะไรจะอยู่ให้มันต่อย ล้อเล่น
คราวนี้จริงๆแล้ว ไม่มีมุขแล้ว

ต่อมาก็ต้องลง Visual Basic 6.0 ตามระเบียบ ซึ่งวิธีที่ผมจะเขียนต่อไปนี้ สามารถใช้ได้กับ Database ทุกชนิดเลยครับ

ผมได้โปรแกรม UL ตัวอย่างขึ้นไปด้วยครับ สามารถ DL ได้ที่
http://gotoknow.org/file/sailomsaengdaed/db.zip
หลังจากที่ DL ไปแล้ว เอาไปขยายแล้วเก็บไว้ที่ d:vbdb นะครับ เพราะ ผมได้เขียนพาธเอาไว้ที่นั้น ท่านสามารถแก้ไข พาธได้ตามชอบเลยครับ และอย่าลืม Reference ซึ่งจะกล่าวไว้ที่ด้านล่างแล้วครับ

อันดับแรก เปิด โปรแกรม อาจจะเปิดจากโปรแกรมเก่า หรือ เริ่มโปรแกรมใหม่ก็ได้

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

หลังจากเปิด โปรแกรมแล้ว เลือก เมนู Project > References…
จะมี Reference ให้เลือก มากมาย แต่เราจะใช้ ADO Library
คลิก Check Box หน้า Microsoft ActiveX Data Object 2.5 Library

ตอนแรกสร้างแฟ้มสำหรับเก็บค่า DSN ก่อน
db.ini
[DB]
COUNT=3
DB1=MySQL
DB2=ORACLE
DB3=MSSQL

[MySQL]
strConnect = "
DRIVER=MySQL ODBC 3.51 Driver;
UID=admin;
STMT=;
OPTION=;
PORT=;
PASSWORD=pwdadmin;
SERVER=192.168.100.253;
DATABASE=kai;;"

ที่จริง strConnect เขียนบรรทัดเดียวนะครับ แต่พอเขียนบรรทัดเดียวแล้ว แสดงผลไม่ถูกต้องใน gotoknow เลยต้องเขียนแบบนี้ ดูได้จากแฟ้มตัวอย่างครับ

[ORACLE]
strConnect = "DRIVER=ORACLE"
[MSSQL]
strConnect = "DRIVER=MSSQL"


ต่อไป สร้าง form ขึ้นมา 1 form มีรายละเอียดดังนี้
frmStartProgram.frm
ComboBox cbbDBSelect
CommandButton cmdRun
CommandButton cmdLoadDSN
Texe txtDSN
Texe txtFiled1
Texe txtFiled2

Option Explicit
Const Num_Buff_Size = 4096
Dim strConnect As String
Private Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" ( _
ByVal lpApplicationName As String, _
ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As String, _
ByVal nSize As Long, _
ByVal lpFileName As String _
) As Long

Function GetMyProFile(strPart As String, strSub As String) As String
Dim chkLen As Integer
Dim valBuff As String * Num_Buff_Size
chkLen = GetPrivateProfileString( _
strPart, _
strSub, _
"", _
valBuff, _
Num_Buff_Size, _
"D:vbget_inidb.ini")
If chkLen = 0 Then
GetMyProFile = ""
Else
GetMyProFile = Left$(valBuff, chkLen)
End If
End Function

Private Sub Form_Load()
Dim intNumDB As Integer
Dim intLoop As Integer
Dim strDBName As String
‘ทำการดึงข้อมูลมาจาก แฟ้ม db.ini เพื่อดูว่าเรามี ฐานข้อมูลอะไรบ้าง
intNumDB = Val(GetMyProFile("DB", "COUNT"))
For intLoop = 1 To intNumDB
strDBName = GetMyProFile("DB", "DB" & intLoop)
'ดึงรายชื่อฐานข้อมูลเข้าสู่ ComboBox
cbbDBSelect.AddItem (GetMyProFile("DB", "DB" & intLoop))
Next intLoop
End Sub

Private Sub cmdLoadDSN_Click()
'โหลดข้อมูล DSN จาก แฟ้ม db.ini ตามที่ได้เลือกไว้
strConnect = GetMyProFile(cbbDBSelect.Text, "strConnect ")
txtDSN = strConnect
End Sub

'ต่อไปจะเป็นการเชื่อต่อฐานข้อมูลกันจริงๆ สักทีนะครับ
'สมมติ มี Database ชื่อ kai และมี table ชื่อ admin มี 2 filed คือ user และ 'password
'ต่อไปจะเป็นการ ดึงข้อมูลออกมานะครับ


Private Sub cmdRun_Click()
Dim DataBaseControl As New ADODB.Command
Dim RecordSetAccess As New ADODB.Recordset
Dim Query As String
Query = "SELECT user,password from admin"
With DataBaseControl
'ส่งค่า DSN เข้าไป เหมือนกับการ Login เข้าสู่ Database
'และ เลือกฐานข้อมูล ตาม DSN ที่ตั้งเอาไว้

.ActiveConnection = strConnect
'ส่งคำสั่ง SQL เข้าสู่ Database
.CommandText = Query
'ส่งแล้วก็สั่งให้มันทำงาน และให้คืนค่ากลับตัวแปร RecordSetAccess
.Execute (RecordSetAccess)
End With
'แน่นอน เราใช้ Select ดังนั้น มังจึงส่งค่ากลับมา
RecordSetAccess.Open DataBaseControl
'ถ้ามาถึงเป็น EOF เลย แปรว่าหาข้อมูลไม่พบ
'เนื่องจากไม่ได้ไม่ได้ใช้ where ดังนั้นจึงแปรว่า ไม่มีข้อมูล
'ถ้ามีข้อมูล ก็จะทำงานต่อจนกระทั้งดึงข้อมูลออกมาหมด

If RecordSetAccess.EOF Then
MsgBox "ไม่พบข้อมูล"
Else
While (Not RecordSetAccess.EOF)
'ดึงข้อมูล Filed ที่ชื่อ user
txtFiled1 = RecordSetAccess!user.Value
'ดึงข้อมูล Filed ที่ชื่อ password
txtFiled2 = RecordSetAccess!password.Value
'ย้ายไปยัง record ต่อไป
RecordSetAccess.MoveNext
Wend
End If
End Sub
สำหรับการ Insert Update Delete ทำเหมือนกันเลยครับเพียงแก้เล็กน้อย เพราะว่า ไม่มีการส่งค่ากลับมา ดังนี้ครับ
With DataBaseControl
.ActiveConnection = strConnect
.CommandText = Query
.Execute
End With

การหาค่า DSN สามารถสร้างได้จาก OBDC Data Source Administrator
แล้ว เปิดดูรายละเอียดได้ใน C:Program FilesCommon FilesODBCData Sources คุณสามารถ copy รายระเอียดในแฟ้ม นามสกุล dsn มาใส่ในแฟ้ม db.ini ได้เลยครับ

เพียงเท่านี้ เมื่อคุณต้องการเปลี่ยนไปใช้ Database ของค่ายอื่น เช่น MySQL > ORACLE ถ้าทำได้ หรือ เปลี่ยน User กะ Password หรือเปลี่ยน Database Server คุณก็เพียงแก้ไขแฟ้ม db.ini ก็พอแล้วครับ