วันนี้ ขึ้นไปตรวจสอบ งานเล็กน้อย (เขียนด้วย 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
ก็พอแล้วครับ
แล้ว 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
เผื่อเป็นแนวทางได้ครับ
ไม่ใช้เพราะ version ที่ต่างกันหรอกครับ
เป็นเพราะตัว Appserver ที่ลงวันก่อนต่างหากครับ
มันบังอาจทำให้ MySQL OBDC ของผมแฮงค์ ทั้งๆที่ ตัว MySQL Server ก็ตัวเดิม Version เดิม
แต่เครื่องอื่นอีก 2 เครื่องที่ไม่ได้ลง AppServer ไม่เห็นเป็นอะไรเลยครับ
สรุป เป็นเพราะ AppServer ที่ลง มันลงตัว MySQL Version อะไรให้ไม่ทราบ เพราะผมไม่ได้ใช้ แต่มีคนมาลงให้เพราะจะทดสอบโปรแกรมที่เขียน เลยทำให้โปรแกรมผมเองพังไปเลย
แต่ก็แก้ไขโดยการลง MySQL OBDC Version ใหม่ ตัวเก่าใช้ไม่ได้แล้ว เพราะตัว DLL ถูก AppServer แก้ไขไปแล้ว
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มากเลย
vbmysqldirect ก็ใช้ติดต่อ mysql ได้ดีเหมือนกัน
เร็วเพราะใช้ กลุ่มคลาส ติดต่อ mysql ผ่าน libmySQL.dll ซึ่งเร็วขึ้นมาอีกนิดหน่อย
ตัวนี้ผมไม่เคยใช้ครับ
ขอบคุณครับกับคำแนำครับ
ถ้าสมมุติว่าไม่มี Access,my SQLอยากรู้ว่าvbทำงานแทนAccess,my SQL ได้ไหม เพราะมันต้องเสียเวลาในกาสร้างdbมากเลย
ตัว Accessม,MySQL เป็นตัว DBMS ครับ
ส่วน VB เป็น Programming จึงเอามาแทนกันไม่ได้ครับ
นองเสียจากว่าคุณจะใช้ VB เขียน DBMS ขึ้นมาเอง
อยากทราบเกี่ยวกับการนำ control array มาใช้ในการเพิ่มข้อมูลเข้าในฐานข้อมูลด้วยคำสั่ง insert into ค่ะ
ดิฉันทำโปรเจ็คเกี่ยวกับระบบจองห้องพักของรีสอร์ท ใช้ VB กับฐานข้อมูล MySQL โดยใช้วิธีการเชื่อมต่อฐานข้อมูลตามตัวอย่างในเว็บนี้ ในส่วนของฟอร์มเลือกห้องพักซึ่งจะมีหลายแบบ เช่น บ้านเดี่ยว บ้านแฝด ดิฉันใช้ Check Box เป็นตัวเลือกซึ่งสามารถเลือกได้มากกว่า 1 จึงตั้งชื่อวัตถุแบบ Control Array ไม่ทราบว่าเหมาะสมกับงานนี้หรือไม่คะ
ตัวอย่างโค๊ด
Private Sub cmdConfirm_Click()
strConnect = "DRIVER=MySQL ODBC 3.51 Driver;UID=root;STMT=;OPTION=;PORT=;PASSWORD=;SERVER=localhost;DATABASE=dbresort;;"
Query = "insert into booking (Booking_No,OrderName,Room_Type,amount) values ('" & txtBookingNo.Text & "','" & txtOrderNa.Text & "','" & chkRoom.Item(i).Caption & "'," & txtAmount(i).Text & ")"
With DataBaseControl
.ActiveConnection = strConnect
.CommandText = Query
.Execute
End With
จากโค๊ดนี้ดิฉันสามารถเพิ่มข้อมูลลงในฐานข้อมูลได้เฉพาะข้อมูลที่อยู่ในอาเรย์ที่ 0 เท่านั้น อยากทราบวิธีเขียนโค๊ดให้มีการเพิ่มข้อมูลของอาเรย์อื่นๆ ที่ถูก check ด้วยค่ะ
รบกวนอีกคำถามนะคะ ดิฉันอยากทราบวิธีเขียนโค๊ดให้เลขที่ใบจองเพิ่มค่าขึ้นเองโดยไม่ต้องกรอกตัวเลขลงไป จาก 01 เป็น 02, 03
ที่ลองเขียนดู สามารถเพิ่มขึ้นได้ในขณะยังใช้งานโปรแกรมอยู่ค่ะ แต่เมื่อปิดโปรแกรมแล้วเข้าใหม่ พบว่า ตัวนับกลับมาเริ่มต้นที่ 01 ใหม่ค่ะ
http://learners.in.th/blog/wavezaa/72898
ที่นี่เขียนละเอียดกว่า ลองเข้าไปดู
แก้ไขให้บุคคลทั่วไปแสดงความคิดเห็นได้ครับ เนื่องจากมีคน mail มาถาม บอกว่าไม่สามารถ post ถามในนี้ได้
คำถามคือ vb สามารถ ติดต่อฐานข้อมูลอะไรได้บ้างครับ
คำตอบคือ (ผมคิดเอาเองนะครับ) สามารถติดต่อได้ทุกฐานข้อมูลที่มี OBDC
มาเล่าให้ฟังครับ ทีมงานพัฒนาระบบโรงพยาบาล พัฒนาบน Visual Basic และ DB เป็น MySQL รองรับงานขนาดใหญ่ และ Critical มากว่า 7 ปี แล้ว ขอบอกว่าเลือก VB กับ MySQL นั้นไม่ผิดหวังครับ
แต่ ที่ รพ. ไม่ได้ใช้ ODBC นะครับ เราใช้ Concept ของ LAMP ครับ
ช่วยดูให้หน่อยครับทำไมมันติดต่อไม่ได้อะครับ
HostIP = "sql204.thport.com"
User = "thpor_2064878"
Pass = "oydgiupo"
DBSource = "thpor_2064878_lpsc"
strCnn = "DRIVER={MySQL ODBC 3.51 Driver}" & _
";SEVER= " & HostIP & _
";DATABASE=" & DBSource & _
";DSQ= myDSN" & _
";UID = " & User & _
";PWD = " & Pass & _
";OPTON = 3"
งงมากก หลายวันละคระบ
ถ้าเป็น DB เป็น MySQL
ตัว MySQL Server เองต้องทำการอนุญาติให้เครื่องที่คุณใช้ทำการติดต่อด้วยครับ
วิธีทดสอบง่ายๆ เข้า DOS ครับ
พิมพ์
mysql -h sql204.thport.com -uthpor_2064878 -poydgiupo
เครื่องคุณ 192.168.0.3
ที่ MySQL Server ต้องพิมพ์ว่า
grant all privileges on thpor_2064878_lpsc.* to [email protected] identified by 'oydgiupo'
ขอบคุณครับ
แต่ว่ามีวิธีเช็คที่ง่ายกว่านี้รึป่าวครับ เพราะมันเป็น Server ฟรี อะครับ ปกติใช้เขียนเว็บแต่ตอนนี้จะเอามาทำโปรเจ็คส่งอาจาร์ยอะครับ อ้อเพิ่มเติมนิดนึงนะครับ คือตอนที่ทำกับ appserv ในเครื่องผม อะทำได้ครับ แต่เปลี่ยนไปติดต่อฐานข้อมูลข้างนอกติดต่อไม่ได้อะครับ
ถ้าใช้ AppServ แล้วใช้ได้
พอเปลี่ยน ไปใช้ MySQL ฟรีแล้วใช้ไม่ได้
ก็แปลว่าทาง Host นั้น ไม่อนุญาติให้ทำการติดต่อครับ
ทางแก้ ก็คงต้องใช้ AppServ ส่งแล้วครับ
หรือไม่ก็ถาม อาจารย์ว่าขอใช้ MySQL Server ภายในได้หรือไม่
ขอบคุณมากๆเลยครับ พี่ๆผู้เชี่ยวชาญ แสดงว่าที่ผมทำนั้นถูกต้องแล้ว เพียวแต่ SERVER เค้าไม่อนุญาติให้ใช้งานได้ถูกต้องรึป่าวครับ ยังไงก็ขอบคุณมากครับ
อ้อ พี่ๆ พอจะมี SERVER ฟรี ที่อนุญาติให้ บ้างรึป่าครับ