การเข้าถึง VBA: เกิดข้อผิดพลาดเมื่อประกาศประเภทของวัตถุฐานข้อมูล: ไม่ได้กำหนดประเภทที่ผู้ใช้กำหนด

ใน 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


person freesoft    schedule 24.02.2014    source แหล่งที่มา


คำตอบ (3)


ลองตรวจสอบ "ข้อมูลอ้างอิง" - คุณจะเห็นว่าไม่มีไลบรารี DAO ตัวอย่างแรกของคุณใช้งานได้เนื่องจาก db มีประเภท Variant และการมอบหมายงาน

Set db = CurrentDb() 

วางวัตถุ COM DAO.Database ใน db และ TypeName ในภายหลังยืนยันว่านี่คือฐานข้อมูล หากคุณต้องการใช้

Dim db   as DAO.Database 

คุณต้องอ้างอิงไลบรารีที่เหมาะสม (เช่น Microsoft DAO)

person 4dmonster    schedule 24.02.2014
comment
ขวา ไม่ได้เปิดใช้งานไลบรารีวัตถุ Microsoft ADO 3.6 ถ้าฉันเปิดใช้งานและกดปุ่มยอมรับ ระบบจะแจ้งว่าเกิดข้อผิดพลาดเมื่อโหลดไลบรารี DLL อาจเป็นเพราะไม่มีไฟล์ dll อยู่ นั่นนำฉันไปสู่คำถามอื่น: หากไม่ได้โหลดไลบรารี ADO วัตถุ ADO จะสร้างและจัดการอย่างไร Access สามารถทำงานกับวัตถุ ADO ได้อย่างไรหากไม่ได้โหลดไลบรารี ADO - person freesoft; 24.02.2014
comment
เปิดใช้งานเป็นคำที่ผิดที่นี่ การอ้างอิงจะดีกว่า คุณสามารถใช้ไลบรารี COM นั้นเป็นไลบรารี COM - CreateObject, GetObject หรือรับ Object เป็นพารามิเตอร์ส่งคืน แต่ถ้าคุณต้องการใช้ภายใน VBA - จะต้องโหลดคำจำกัดความของมันลงใน VBA ซึ่งเรียกว่าการอ้างอิงที่นี่ - person 4dmonster; 24.02.2014
comment
อืมฉันเข้าใจแล้วว่ามันยุ่งยากนิดหน่อย :-) ขอบคุณสำหรับข้อมูลของคุณ อย่างไรก็ตาม ฉันจะใช้ทางเลือก ADODB ที่ฉันพบ ตามที่อธิบายไว้ในส่วนแก้ไข: ของคำถาม - person freesoft; 24.02.2014

คุณสามารถประกาศ "db" เป็นวัตถุได้และทุกอย่างก็เหมือนกัน เช่น Dim db As Object

person AnonymousA    schedule 18.03.2014

อาจเป็นไปได้ว่าโครงการของคุณจะถูกเรียกว่าฐานข้อมูลซึ่งเป็นชื่อเริ่มต้น มีการเปลี่ยนแปลง และคุณสามารถประกาศ Dim db เป็นฐานข้อมูลได้

person Alfonso    schedule 04.06.2021