ใน Access 2010 VBA หากฉันเรียกใช้ส่วนย่อยนี้:
sub test
Dim db
Dim rst
Set db = CurrentDb()
Set rst = db.OpenRecordset("select * from mytable")
Debug.Print "db: " & TypeName(db)
Debug.Print "rst: " & TypeName(rst)
end sub
จากนั้นจะแสดง (ในแผง "ระดับกลาง"):
db: Database
rst: Recordset2
ดังนั้นจึงใช้งานได้ และติดตั้งไลบรารีทั้งหมดอย่างถูกต้อง (เช่น ADO)
ตกลง ตอนนี้ฉันต้องการประกาศประเภทตัวแปรอย่างชัดเจน โดยใช้ประเภทที่แสดง ("ฐานข้อมูล" และ "Recordset2") ดังนั้นฉันจึงแก้ไขย่อยในลักษณะนี้:
sub test
Dim db as Database ' explicitly
Dim rst as Recordset2 ' explicitly
Set db = CurrentDb()
Set rst = db.OpenRecordset("select * from mytable")
Debug.Print "db: " & TypeName(db)
Debug.Print "rst: " & TypeName(rst)
end sub
และเมื่อฉันเรียกใช้ ฉันได้รับข้อผิดพลาดต่อไปนี้ที่บรรทัด "Dim db as Database":
Compilation error:
User defined type is not defined
เลยเข้าใจว่าไม่ได้กำหนดประเภท "ฐานข้อมูล" (!) ทำไม
หมายเหตุ: ฉันได้ลองแล้ว:
Dim db as ADO.Database ' explicitly
Dim rst as ADO.Recordset2 ' explicitly
และ:
Dim db as ADODB.Database ' explicitly
Dim rst as ADODB.Recordset2 ' explicitly
และ:
Dim db as DAO.Database ' explicitly
Dim rst as DAO.Recordset2 ' explicitly
และเกิดข้อผิดพลาดแบบเดียวกันกับพวกเขาทั้งหมด มันเป็นไปได้ยังไงกัน? ทำไมมันถึงใช้งานได้ถ้าฉันไม่ประกาศประเภท?
แก้ไข: ฉันเพิ่งค้นพบว่า Access ยังมีออบเจ็กต์ ADODB.Connection สำหรับฐานข้อมูลปัจจุบัน โดยการเรียกไปที่ "CurrentProject.Connection" ฉันจึงประกาศได้อย่างชัดเจนว่า
sub test
Dim db As ADODB.Connection
Set db = CurrentProject.Connection ' Access gives an ADODB object too!
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
rst.Open "select * from mytable", db
Debug.Print "db: " & TypeName(db)
Debug.Print "rst: " & TypeName(rst)
end sub
นั่นแสดงให้เห็นว่า:
db: Connection
rst: Recordset
ดังนั้นฉันจะใช้มันเนื่องจาก ADO ทันสมัยกว่า DAO