สอบถาม การ connect mysql database โดย ODBC
กระทู้เก่าบอร์ด อ.Yeadram

 3,140   5
URL.หัวข้อ / URL
สอบถาม การ connect mysql database โดย ODBC

ผมได้เขียนโปรแกรม โดย MS access แล้ว link Table กับ serve mysql database ด้วย ODBC ปัญหาคือ เวลาจะเปลี่ยนให้โปรแกรมไปใช้กับ server ตัวอืน จะต้องมา link table ใหม่ ทุกครั้ง ผมอยากจะทราบว่า สามารถสร้างฟอร์ม ที่กำหนด parameter สำหรับ เชื่อมต่อฐานข้อมูลดังนี้ได้หรือไม่ เพื่อให้เชื่อมต่อกับฐานข้อมูลที่ต้องการ และเขียน code อย่างไร ครับ
ip adress:
user:
Password:
port:
database name:
และอื่นๆ
ปล.ผมใช้ driver mysql-connector-odbc-3.51.30-win32.msi
ขอบคุณครับ

5 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R19293
ลองเอาโค้ดนี้ไปศึกษาดูนะครับ
http://gainingaccess.net/GainingAccess/CodeDownloads/SafeODBCTablesQueries.htm

ส่วน Connection String ของ MySQL ให้ดูจาก
http://www.connectionstrings.com/mysql/
2 @R19294
รบกวนอาจารย์อธิบายหลักการการนำไปใช้งานหน่อยครับ
ผมไม่ได้จบด้าน IT หรือ database มา อ่านแล้วยังนึกภาพไม่ออก ว่าจะใส่ code ตรงไหน แล้ว code มีขั้นตอนการทำงานอย่างไร
หรือใครพอจะมี file ตัวอย่าง รบกวนขอเป็นกรณีศึกษานะครับ ขอบคุณครับ
3 @R19296
ต้องรอช่วงสักบ่าย 3 นะครับ ผมถึงจะว่างอธิบายให้
4 @R19303
ในโค้ดมี 4 รูทีนคือ

- InitODBCDB สำหรับทำการ login ผู้ใช้เข้าสู่ฐานข้อมูล ในตย.นี้คือ SQL Server ไม่ใช่ MySQL

- GetSafeCnnString ให้ค่า connection string สำหรับเชื่อมต่อไปยังฐานข้อมูล ; connection string คือข้อความที่ติดต่อฐานข้อมูล ว่าต้องการใช้ฐานข้อมูลอะไร ที่ไหน โดยใคร

- SecureTablesNViewsRelink เป็นการลิงค์เทเบิลไปยังเทเบิลในฐานข้อมูลตามที่กำหนดโดย GetSafeCnnString

- SecurePTQueriesRelink เหมือน SecureTablesNViewsRelink แต่เป็นการลิงค์คิวรี่แทน ถ้าในระบบคุณไม่มีการลิงค์ไปหาคิวรี่บน database server ก็ไม่ต้องใช้รูทีนนี้

หลักการคือต้องมีหน้าฟอร์มที่รับ user id และ password ของผู้ใช้ พอกดปุ่ม login ก็เรียกฟังก์ชั่น InitODBCDB ถ้าเรียกแล้วไม่ผ่าน แปลว่า id หรือ password หรือค่าอื่นๆในตัวแปร strCnn ในรูทีนนี้ผิดแน่ๆ หลังจากนั้นก็ทำการ relink เทเบิลต่างๆ (ที่เราเคยลิงค์ไปยังฐานข้อมูลแล้ว) ด้วยรูทีน SecureTablesNViewsRelink ไปยังฐานข้อมูลปลายทางที่กำหนดโดยรูทีน GetSafeCnnString

สมมุติฟอร์มของเรามีเท็กซ์บ็อกซ์ขื่อ UserID และ Password และมีปุ่มชื่อ Login ตย.โค้ดก็คือ

Private Sub Login_Click()
   if not InitODBCDB(me.UserID, me.Password) then
      msgbox "Invalid login. Please try again."
      exit sub
   end if

   if not SecureTablesNViewsRelink then
      msgbox "Unable to link table to database."
      exit sub
   end if
end sub

ถ้าสังเกตให้ดีจะเห็นว่าเรามีระบุ user id และ password เฉพาะแค่ตอนทำการ login เข้าฐานข้อมูลเท่านั้น ส่วน connection string ที่ใช้ตอนทำ relink เทเบิล เราไม่มีการระบุไว้ แปลว่าลิงค์เทเบิลบน Access ก็ไม่ได้เก็บข้อมูล user id และ password ไว้ในตัวลิงค์เทเบิลเองด้วย   user id และ password ที่ผ่านเข้าฐานข้อมูลด้วยรูทีน InitODBCDB ได้แล้ว จะถูกจำไว้ในหน่วยความจำโดย DAO (ส่วนหนึ่งของตัวกลางที่จัดการเรื่องฐานข้อมูลผ่าน Access) อย่างอัตโนมัติ เมื่อใดที่เรากระทำต่อฐานข้อมูลที่ระบุโดย connection string ที่มี Driver, Server และ Database เดียวกันกับที่ user id และ password ที่เก็บไว้นั้นใช้อยู่ด้วย     DAO ก็จะใช้ user id และ password ที่เก็บไว้นั้นแทน แม้เราจะระบุ user id และ password ของคนใหม่ไปพร้อมกับ connection string ครั้งใหม่ก็ตาม   DAO ก็ยังจะใช้ของคนเดิมอยู่ดี มันจะถูกเก็บในหน่วยความจำจนกว่าเราจะออกจากโปรแกรมของเรา (แปลกดีไหมครับ !!!) user id และ password ก็จะหายไป ดังนั้นถ้ามีคนขโมยไฟล์โปรแกรมของเราไป เขาก็ไม่มีทางแกะหา user id และ password ได้ เพราะไม่ได้ถูกเก็บไว้ในไฟล์นั้นเลย เหตุนี้จึงเรียกมันว่า Secure Relink (เรียกการเชื่อมต่อประเภทนี้ว่า DSN-Less Connections) แต่มันก็มีข้อเสียเล็กๆคือ เราจะไม่สามารถทำให้ผู้ใช้คนอื่นล็อคอินเข้าไปใหม่โดยไม่ต้องออกจากโปรแกรมเดิมเสียก่อนนั่นเอง

ปัญหาในโค้ดที่ต้องแก้ไขมี 2 จุดก็คือ

1. คุณต้องใช้ connection string ของ MySQL แทน SQL Server ซึ่งต้องไปลองหาเองตามลิงค์ที่ผมให้คุณไปแล้ว

2. ไม่รู้ว่าใน MySQL มีเทเบิลของระบบที่ชื่อ SYSTEM_USER (จากบรรทัด .SQL = "SELECT SYSTEM_USER As MyLogin;" ในรูทีน InitODBCDB) เหมือนใน SQL Server หรือไม่ ถ้าไม่มีก็ให้หาเทเบิลอะไรก็ได้ของ MySQL ที่ผู้ใช้ทุกคนสามารถเรียกใช้ได้แทน
5 @R19304
จะลองประยุกต์ใช้ดูครับ ขอบคุณมากครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2719s