Akses VBA: Kesalahan saat mendeklarasikan tipe objek Database: Tipe yang ditentukan pengguna tidak ditentukan

Di Access 2010 VBA, jika saya menjalankan sub ini:

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

kemudian muncul (di panel "Menengah"):

db:  Database
rst: Recordset2

jadi berfungsi, dan semua perpustakaan diinstal dengan benar (ADO misalnya).

Oke, sekarang saya ingin mendeklarasikan tipe variabel secara eksplisit, dengan menggunakan tipe yang ditampilkan ("Database" dan "Recordset2"), jadi saya memodifikasi subnya dengan cara ini:

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

dan ketika saya menjalankannya, saya mendapatkan kesalahan berikut pada baris "Redupkan db sebagai Database":

Compilation error:
User defined type is not defined

Jadi saya mengerti bahwa tipe "Database" tidak ditentukan (!). Mengapa?

Catatan: Saya juga sudah mencoba:

Dim db   as ADO.Database        ' explicitly
Dim rst  as ADO.Recordset2      ' explicitly

Dan:

Dim db   as ADODB.Database      ' explicitly
Dim rst  as ADODB.Recordset2    ' explicitly

Dan:

Dim db   as DAO.Database        ' explicitly
Dim rst  as DAO.Recordset2      ' explicitly

dan mendapatkan kesalahan yang sama dengan semuanya. Bagaimana itu mungkin? Mengapa ini berhasil jika saya tidak mendeklarasikan tipenya?


Edit: Saya baru saja mengetahui bahwa Access juga menawarkan objek ADODB.Connection untuk database saat ini, dengan memanggil "CurrentProject.Connection". Jadi saya dapat secara eksplisit menyatakan:

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

pertunjukan itu:

db:  Connection
rst: Recordset

Jadi saya akan menggunakannya, karena ADO lebih modern dari DAO.


person freesoft    schedule 24.02.2014    source sumber


Jawaban (3)


Coba periksa "Referensi" - Anda akan melihat tidak ada perpustakaan DAO. Contoh pertama Anda berfungsi karena db memiliki tipe Varian. Dan tugas

Set db = CurrentDb() 

menempatkan objek COM DAO.Database di db, dan kemudian TypeName mengonfirmasi bahwa ini adalah Database. Jika Anda ingin menggunakan

Dim db   as DAO.Database 

Anda harus Referensi perpustakaan yang sesuai (Microsoft DAO misalnya)

person 4dmonster    schedule 24.02.2014
comment
Benar, Perpustakaan Objek Microsoft ADO 3.6 tidak diaktifkan. Jika saya mengaktifkannya dan menekan tombol Terima, maka dikatakan Error saat memuat perpustakaan DLL. Mungkin penyebabnya adalah file dll tidak ada. Itu membawa saya ke pertanyaan lain: Jika perpustakaan ADO tidak dimuat, bagaimana objek ADO dibuat dan ditangani? Bagaimana Access bisa bekerja dengan objek ADO, jika perpustakaan ADO tidak dimuat? - person freesoft; 24.02.2014
comment
Diaktifkan adalah kata yang salah di sini, Direferensikan lebih baik. Anda dapat menggunakan perpustakaan COM tersebut sebagai perpustakaan COM - CreateObject, GetObject atau menerima Objek sebagai parameter pengembalian. Tetapi jika Anda ingin menggunakan di dalam VBA - definisinya harus dimuat ke dalam VBA, yang disebut referensi di sini. - person 4dmonster; 24.02.2014
comment
Hmm, begitu, ini agak rumit :-) Terima kasih atas informasinya. Pokoknya saya akan menggunakan alternatif ADODB yang saya temukan, seperti yang saya jelaskan di bagian Edit: pada pertanyaan. - person freesoft; 24.02.2014

Anda dapat mendeklarasikan "db" sebagai objek dan yang lainnya sama. yaitu Redupkan db Sebagai Objek

person AnonymousA    schedule 18.03.2014

Mungkin proyek Anda akan disebut Database yang merupakan nama default, diubah dan Anda dapat mendeklarasikan Dim db sebagai Database

person Alfonso    schedule 04.06.2021