งง กับ ADO vs DAO ค่ะ
กระทู้เก่าบอร์ด อ.Yeadram

 6,540   6
URL.หัวข้อ / URL
งง กับ ADO vs DAO ค่ะ

พอดีอ่านหนังสือ แล้วลองทำตาม ชักจะเริ่ม งง งง
ว่าจริงๆ ต้องใช้แบบไหนดี

สรุปแล้ว มือใหม่เนี่ย
ADO หรือ DAO ดีคะ

มันแตกต่างกันยังไง

อันไหนน่าจะใช้ง่ายกว่ากันคะ (สำหรับมือใหม่)

เนื่องจากตอนนี้ ... ยังไม่ค่อยเข้าใจกับ ... Recordset เลยค่ะ

ตอนนี้ปัญหาก็คือ มัน Error อ่ะค่ะ

เลยทำตามตัวอย่างของหนังสืออันต่อๆไปไม่ได้

เครื่องที่ใช้เป็น Access 2007 + Vista
ทีนี้ ... ลองทำตามตัวอย่างของหนังสือ แล้วมัน error ตรง
cnn.Open

แก้ไขได้ยังไงมั่งอ่ะคะ
ต้องเข้าไปเพิ่ม driver หรือต้องแก้ตรงไหน

รบกวนด้วยค่ะ

ปล. พอจะมีหนังสือแนะนำ เกี่ยวกับการเขียนคำสั่งบ้างไหมคะ

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

1 @R00585
2007 ผมเพิ่งจะติดตั้ง อิอิ ยังไม่ได้ลองถึงขั้น เขียน vba เลย ไม่รู้มีอะไรแตกต่างมั้ย
แต่ถ้าตามประสบการณ์ เวอร์ชั่น 2000 และ 2002
ที่คุณกำลังใช้ คือ ado ครับ และผิด ตามที่มัน error จริง

การประกาศตัวแปร
Dim cnn As ADODB.Connection ' สร้าง ออบเจ็ค คอนเน็คชั่น จาก class adodb

เวลาจะใช้ ต้องระบุก่อนว่า ตัวแปรที่ประกาศไว้ เป็นออบเจคตัวใหม่
Set cnn = New ADODB.Connection
หมายถึง ตั้งให้ cnn เป็น object ใหม่ๆ สดๆ ยังไม่เคยมีการประกาศใช้มาก่อนหน้านี้ (ภายใน procedure เดียวกัน)

บ่อยครั้ง ที่เราคิดว่าเสียเวลา ทำไม ต้อง ประกาศตัวแล้ว แล้วมาประกาศอีกว่า ตัวนี้เป็นตัวสดๆ ใหม่ๆ
เลยมีการใช้ New ไว้ในขั้นตอนการประกาศตัวแปรซะเลย จะได้ลดการทำงาน ก็จะได้เป็น....

Dim cnn As New ADODB.connection
จะเห็นได้ว่า เราทำคำสั่งไปสองอย่างแล้ว ในบรรทัดเดียว
เมื่อทำข้างต้นแล้ว ไม่ต้องมาประกาศซ้ำอีกว่า มันเป็นตัวใหม่ๆ สดๆ
ไม่งั้น มันจะซ้ำซ้อน คือคุณกำลัง สร้าง ออบเจ็คสองตัวที่มีชื่อเดียวกัน

ใช่หรือเปล่าครับ อาจารย์สันติสุข นี่ผมมั่วๆ เอาตามความคิดของผมเองนะครับ อิอิ ไม่มีหลักวิชามาสนับสนุนทั้งสิ้น
2 @R00586
การเข้าถึงข้อมูลนั้น ทาง Microsoft ได้สร้างไลบรารี่เอาไว้ ซึ่งมีหลายระดับ ตั้งแต่ระดับลึกๆ (System Level) ได้แก่ OLE DB จนถึงระดับบนๆ (Application Level) ให้เราได้เรียกใช้ ได้แก่ DAO (Data Access Object) และ ADO (ActiveX Data Object) เป็นต้น โดยรวมๆแล้วเรียกเรื่องพวกนี้ว่าอยู่ในกลุ่ม Data Access Component ซึ่งเป็นองค์ประกอบของระบบ Windows อยู่แล้ว ; ใน Windows XP, 2003 Server เขาเรียกว่า MDAC (Microsoft ...) ล่าสุดคือ MDAC 2.8 ; แต่ใน Vista เขาเรียก Windows DAC ล่าสุดคือเวอร์ชั่น 6.0 ; MDAC นั้น ปัจจุบันจะไม่รวม DAO ไว้แล้วเพราะไม่มีการพัฒนาต่อไปแล้ว

DAO นั้นมีมานาน และเป็นเทคโนโลยี่เก่า เอาไว้ใช้กับฐานข้อมูลที่เป็น .mdb โดยเฉพาะ แต่ไม่ได้หมายความว่าเราจะเข้าถึงฐานข้อมูลประเภทอื่นผ่าน DAO ไม่ได้ เพราะเราสามารถเรียกใช้ ODBC ผ่าน DAO ได้เช่นกัน ... ต่อมา Microsoft ได้พัฒนาไลบรารี่ขึ้นมาโดยใช้เทคโนโลยี่ใหม่ ผลก็คือ ADO นั่นเอง แล้วสิ่งที่ Microsoft วางแผนไว้ก็คือ เขาจะเลิกสนับสนุน DAO (เวอร์ชั่นสุดท้ายคือ DAO 3.6) แต่จะหันไปพัฒนา ADO ต่อไปเรื่อยๆ (อ่านได้จากเรื่องนี้ Data Access Technologies Road Map   http://msdn.microsoft.com/en-us/library/ms810810.aspx) ADO นั้น นอกจากจะเข้าถึงข้อมูลในฐานข้อมูลแล้ว ยังสนับสนุนการเข้าถึงข้อมูลรูปแบบอื่นๆด้วย เช่น เท็กซ์ไฟล์, เอ็กเซลไฟล์ เป็นต้น แทบจะพูดได้ว่า เราจะหาเรื่องเกี่ยวกับ DAO บนเวป MSDN ของ Microsoft ได้ยากเต็มทน จะมีแต่เรื่อง ADO, ADO.NET, OLE DB ทั้งนั้น

ดังนั้นถ้าคุณเริ่มศึกษา Acces 2007 ก็กระโดดไปหา ADO ได้เลยครับ แต่ถ้ามีเวลา เรียนรู้ DAO ให้ผ่านตาไว้ก็จะดีเพราะแม้ว่าจะเป็นเทคโนโลยี่เก่า แต่ยังมีโปรแกรมเมอร์เป็นล้านๆคนทั่วโลก ยังใช้ DAO ร่วมอยู่ด้วย

คำถามต่อไป... Recordset คืออะไร ... มันก็คืออ๊อปเจ็คที่เอาไว้เก็ยเรคอร์ดนั่นเอง การที่คุณจะเข้าถึงเรคอร์ดได้ คุณต้องเข้าผ่าน Recordset ครับ

คำถามต่อไป... cnn.Open ผิดอะไร .... ตรงนี้ขอให้บอกด้วยว่า error message คืออะไร ไม่งั้นบอกยากครับ แต่ที่เห็นประหลาดๆหน่อย (แต่ไม่น่าเกี่ยวกับที่ error) ก็คือ บรรทัด Dim cnn มี New และบรรทัด Set cnn ก็มี New ด้วย ขออธิบายครับว่า cnn นั้นเป็น Object Variable   การสั่ง Dim ทำให้สร้างแค่ Pointer เท่านั้น ยังไม่ได้สร้างอ๊อปเจคจริงๆขึ้นมา (ลองไปอ่านเรื่องเกี่ยวเนื่องเพิ่มเติมที่นี่ http://www.thai-access.com/yeadram_view.php?topic_id=21) แต่ถ้าเราใส่คำว่า New ไว้ใน Dim แล้ว (เราเรียกว่า Implicit Object Declaration) ก็เท่ากับเป็นการสร้างอ๊อปเจคขึ้นมาให้อย่างอัตโนมัติเมื่อเมื่อไหร่ก็ตามที่โปรแกรมมีการอ้างถึง Object Variable นั้นและอ๊อปเจคยังไม่เคยถูกสร้างมาก่อนเลยโดยที่โปรแกรมเราไม่ต้องมีคำสั่ง Set cnn = New ADODB.Connection อีกเลย (ตามที่คุณ yeadram บอก) นี่คือสิ่งที่บอกว่าประหลาด แต่ถ้าจะทำก็ไม่ได้ถือว่าทำให้เกิด error ครับ    ในทางกลับกันถ้าเราไม่มีคำว่า New ในบรรทัด Dim เราก็ต้องไปสั่ง Set cnn = New ADODB.Connection แทน (เราเรียกว่า Explicit Object Declaration) เพื่อสร้างอ๊อปเจคจริงขึ้นมา

คำถามต่อไป .. หนังสือเล่มไหนดี ? ... ผมอ่านจาก Help File ของ Microsoft Access และจากเวปของ Microsoft (สำหรับ Access 2007 http://msdn.microsoft.com/en-us/library/bb979619.aspx) ก็พอครับ
3 @R00588
ขอโทษค่ะที่เข้ามาช้า

ตอนนี้ อ่านแล้วยัง งง งง
เดี๋ยวจะอ่านทบทวนให้เข้าใจอีกที

คือ Error ที่เกิดขึ้น เค้าแจ้งแบบนี้อ่ะค่ะ
ตามรูปค่ะ

http://www.fakloop.com/out.php/i869_error1.jpg

ยังไงเดี๋ยวจะลองไปทำใหม่อีกทีค่ะ

ขอบคุณมากค่ะ
4 @R00589
ตกลง error คือ runtime 3706 - Provider can not be found. It may be not properly installed.


เป็นไปได้ว่า MDAC อาจจะ corrupt ไปแล้ว ลองลง MDAC2.8 ใหม่ครับ ดาวโหลดได้จากที่นี่
Microsoft Data Access Components (MDAC) 2.8
http://www.microsoft.com/downloads/details.aspx?FamilyID=6c050fe3-c795-4b7d-b037-185d0506396c&DisplayLang=en

แล้วลง Jet Service Pack 8 ด้วยก็ดีครับ
Jet 4.0 Service Pack 8 (SP8) for Windows XP
http://www.microsoft.com/downloads/details.aspx?FamilyID=2deddec4-350e-4cd0-a12a-d7f70a153156&DisplayLang=en

แต่ถ้าเครื่องไม่ได้ใช้ WindowsXP ก็เลือกหาเวอร์ชั่นที่ถูกต้องเอาด้วยนะครับ หาได้จาก
Microsoft Download Center
http://www.microsoft.com/downloads/Search.aspx?displaylang=en
5 @R00594
ขอบคุณค่ะ
จะลอง D/L มาและลองทำดูใหม่ค่ะ
6 @R03865
จากที่เคยเชื่อมั่นว่าเทคโนโลยี่ DAO จะหยุดการพัฒนา เพราะดูจาก Roadmap ที่ Microsoft ได้แจ้งเอาไว้อย่างเป็นทางการในเวปเขาเอง และก็ยังไม่มีการเปลี่ยนแปลงใดๆในเรื่องนี้   แต่พอมาถึง Access 2007 เราจะเรียกว่ามันถูกเปลี่ยนชื่อใหม่ได้ไหม ตอนนี้ใน Access 2007 ใช้ชื่อว่า ACE (Access Database Engine) แทน ซึ่งทีมพัฒนาของ Access เองได้เป็นเจ้าของโค้ดนี่ทั้งหมดเพราะพวกเขาเริ่มต้นเขียนใหม่เองเลย (แปลว่าตัว DAO เดิม ไม่ได้เป็นของทีมพัฒนา Access)

ตรงจุดนี้มันมีคำถามนึงว่า ตกลงแล้ว ควรจะใช้ ADO หรือ DAO กันแน่ ก็ลองไปอ่าน Is it better to use ADO or DAO in Access 2007? ก็มีหลายความเห็น บ้างก็บอกว่าแล้วแต่งาน แต่ผมชอบคำตอบล่างสุดของ Albert D. Kallal อาจทำให้ต้องเปลี่ยนความคิดจากที่ว่า DAO จอดไม่ต้องแจวไปแล้ว มาเป็นการกลับมาของ DAO ในโฉมใหม่ก็เป็นได้ ซึ่งถ้าเป็นอย่างนั้นจริงก็มีเฮ เพราะผมเองก็แฟน DAO เหมือนกัน

ลองไปอ่านดูครับ ของพวกนี้บางทีก็กลับไปกลับมา ใครเจอเรื่องอะไรที่ยืนยันหรือคัดค้านกับเรื่องนี้ ก็ช่วยเอามาบอกเล่ากันบ้าง รู้ทิศทางของ Microsoft หรือพวกมือระดับพระกาฬเอาไว้บ้าง ก็น่าจะเป็นประโยชน์ต่อพวกเรา เพราะ...พวกเราเป็นได้แค่ผู้ตามเท่านั้นครับ
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.4367s