วันนี้ ขึ้นไปตรวจสอบ งานเล็กน้อย (เขียนด้วย 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
ก็พอแล้วครับ
อยากได้การเขียนติดต่อกับ Oracle ค่ะ
แล้ว MS Assess หละครับ ทำไง
แล้ว ถ้าเราจะเอาโปรแกรม ไว้ที่ C:Program FilesMyProgram เราจะแก้
chkLen = GetPrivateProfileString( _
strPart, _
strSub, _
"", _
valBuff, _
Num_Buff_Size, _
"D:vbget_inidb.ini")
ยังไงครับ เพราะว่าทำแล้วมันจะมองเป็น C:Program
มาแล้วครับ
ถ้าเป็น Access ใส่ดังนี้ครับ
DSN=
MS Access 97 Database;
DBQ=db2.mdb;
DefaultDir=;
DriverId=281;
FIL=MS Access;
MaxBufferSize=2048;
PageTimeout=5;
UID=admin;
ถ้ามี Password ก็ใส่ Password ให้มันนะครับ
ส่วน oracle นั้น คอยสักครู่ครับ เนื่องจากไม่มีเวลาว่างทดสอบครับ
ส่วน MSSQL นั้น ผมไม่มีงบในการจัดหาครับ เลยแสดงตัวอย่างให้ดูไม่ได้
ขณะนี้ ใครก็ตามที่ใช้ MySQL OBDC ตัวเก่าอยู่ให้ UPDATE เป็น Version ด้วยครับ
ไม่ทราบว่าทำไมมันไม่ยอมทำงานเอาดื้อๆ ขนาด ไป DL มาใหม่ยังไม่ยอมทำงาน พอไป DL VERSION ใหม่มาจึงยอมทำงาน
แล้วที่ว่าไม่ทำงานนั้นเพราะอะไรครับ
dll คืนค่า error อะไรมาให้หรือเปล่าครับ?
http://patrickz.gotoknow.org
คล้ายกับว่าหมดอายุอะไรประมาณนี้
แต่ error ที่แจ้งมากลับบอกว่า ไม่สามารถเชื่อมต่อกับ MySQL Server ได้ ผมก็ test หมดทุกอย่างแล้วผ่านหมด
แต่พอ DL Ver ใหม่มาก็ใช้ได้ครับ
แต่อีก 2 เครื่องที่ลงก็ยังสามารถใช้งานได้ตามปกตินะครับ
แอ๊ะ หรือว่า เป็นเพราะวันก่อนผมลง AppServer เลยทำให้ OBDC เพี้ยน เพราะอีก 2 เครื่องนั้น ผมลงแค่ MySQl OBDC อย่างเดียวเท่านั้น
ไม่แน่ใจว่า เป็นเพราะ version ที่ต่างกันหรือไม่ ลองอ่าน
http://www.narisa.com/forums/index.php?showtopic=7303
เผื่อเป็นแนวทางได้ครับ
http://patrickz.gotoknow.org
ไม่ใช้เพราะ version ที่ต่างกันหรอกครับ
เป็นเพราะตัว Appserver ที่ลงวันก่อนต่างหากครับ
มันบังอาจทำให้ MySQL OBDC ของผมแฮงค์ ทั้งๆที่ ตัว MySQL Server ก็ตัวเดิม Version เดิม
แต่เครื่องอื่นอีก 2 เครื่องที่ไม่ได้ลง AppServer ไม่เห็นเป็นอะไรเลยครับ
สรุป เป็นเพราะ AppServer ที่ลง มันลงตัว MySQL Version อะไรให้ไม่ทราบ เพราะผมไม่ได้ใช้ แต่มีคนมาลงให้เพราะจะทดสอบโปรแกรมที่เขียน เลยทำให้โปรแกรมผมเองพังไปเลย
แต่ก็แก้ไขโดยการลง MySQL OBDC Version ใหม่ ตัวเก่าใช้ไม่ได้แล้ว เพราะตัว DLL ถูก AppServer แก้ไขไปแล้ว
อยากทราบว่า VB6 จะใช้งานร่วมกับ MS-Access จะต้อวทำยังไงคะ..พอดีต้องทำ Project แล้วต้องใช้โปรแกรมทั้ง 2 ตัวนี้อ่ะค่ะ…สำหรับ Project ที่จะทำ เป็นเรื่องของระบบฝาก-ถอนเงินน่ะค่ะ ใครทราบช่วยอธิบายให้หน่อยนะคะ ส่งไปในเมล์ก็ได้..ขอบคุณมากๆ ค่ะ…
ลองอ่านใหม่ดูนะค่ะจะบอกวิธีดการติดต่อกับ DB ตัวอื่นด้วย
หรือ อ่าน คห3. เป็นแนวทางก่อนก็ได้ค่ะ
Mysql ODBC นี่คือตัว Mysqlหรือเปล่าครับ หรือคนละตัว
Mysql ODBC คือ ตัวกลางที่ติดต่อกับ MySQL ครับ
เหมือนกับพ่อค้าคนกลาง เราจะชื้อของ เราก็ชื้อของเราก็ชื้อกับพ่อค้าคนกลาง เราต้องการอะไรก็บอกพ่อค้าคนกลางมา แล้วพ่อค้าคนกลางจะไปหามาให้
แต่ถ้าเราลง MySQL Server แล้ว โดยปกติมันจะลงตัว MySQL ODBC มาให้พร้อมกัน
ชึ้งการใช้ ODBC ก็มีข้อดีคือ เราไม่ต้องกังวลว่าเราจะใช้ตัว SQL SERVER ของ อะไร เช่น เราใช้ MySQL ใช้สักพัก เราก็เปลี่ยนไปใช้ตัว ORACLE ได้ทันท โดยที่ไม่ต้องแก้ไข CODE ถ้าตัว SQl COMMAND เราใช้แบบมาตรฐาน
ตอนนี้กำลังทำโปรเจ็คจบระดับ ป.ตรี ใช้ VB+MySQL
หาข้อมูลอ้างอิงยากมาก ดีใจมากๆ เลยค่ะที่มาเจอบทความนี้
ทำให้มีกำลังใจขึ้นมาหน่อย เกือบจะต้องเปลี่ยนไปใช้ SQL Server แล้ว
เรียนสาขาอะไรหละครับ
เรียนสาขาระบบสารสนเทศทางคอมพิวเตอร์ ม.ราชมงคลล้านนาเชียงรายค่ะ
vbmysqldirect ก็ใช้ติดต่อ mysql ได้ดีเหมือนกัน
เร็วเพราะใช้ กลุ่มคลาส ติดต่อ mysql ผ่าน libmySQL.dll ซึ่งเร็วขึ้นมาอีกนิดหน่อย
ถ้าสมมุติว่าไม่มี Access,my SQLอยากรู้ว่าvbทำงานแทนAccess,my SQL ได้ไหม เพราะมันต้องเสียเวลาในกาสร้างdbมากเลย