DAO Revisitado - Perguntas e Respostas !


1-) Como eu posso saber qual versão da DAO minha aplicação esta usando ?

Basta usar o código:   

Dim strversao as string

strversao = DBEngine.Version       ==>   a variável strversao irá conter a versão da DAO utilizada

2-) Qual é a mais nova versão da DAO ?

A última versão atualizada para a DAO é a 3.6 - Microsoft DAO 3.6 Object Library.

3-) Por que a DAO 3.5 não funciona no Windows 95 ?

a-)Você deve copiar o arquivo OLEAUT32.DLL ( 2.20.4054 ou superior) para o diretórios SYSTEM e registrár este arquivo assim:

REGSVR32.EXE OLEAUT32.DLL 

b-) Defina um valor para a variável de ambiente TEMP

c-) Você deve ter instalado a livraria EXPSRV.DLL requerida por VBAJET32.DLL.

4-) Quais drivers ISAM DAO estão disponíveis em meu computador ?

Execute o programa REGEDIT.EXE e procure pela seguintes entradas no registro:

MyComputer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5\ISAM Formats  => para versão 3.5X

MyComputer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\ISAM Formats  => para versão 3.6

abaixo o resultado para a versão presente em minha máquina 

5-) Onde conseguir informações sobre a DAO ?

O arquivo DAO35.HLP presente no diretório :

C:\Arquivos de programas\Arquivos comuns\Microsoft Shared\DAO    ou 

(C:\Program Files\Common Files\Microsoft Shared\DAO)  contém um Help em português(parcial) sobre a ADO:

Abaixo alguns links onde você pode obter mais informações sobre a DAO:

6-) Como criar um novo arquivo de banco de dados Access com a DAO ?

 

Para criar um banco de dados Access usamos o método CreateDatabase

 

Dim wrkDefault As Workspace
Dim dbNovo As Database
Dim prpLoop As Property

Set wrkDefault = DBEngine.Workspaces(0)

' Verificar se já não existe o arquivo.
If Dir("NovoDB.mdb") <> "" Then Kill "NovoDB.mdb"

' Cria um novo banco de dados Encriptado.
Set dbNovo = wrkDefault.CreateDatabase("NovoDB.mdb", dbLangGeneral, dbEncrypt)

With dbNovo
   Debug.Print "Propriedades de " & .Name
   ' Enumera as propriedades do novo Banco de dados criados.
    For Each prpLoop In .Properties
          If prpLoop <> "" Then Debug.Print " " & prpLoop.Name & " = " & prpLoop
    Next
End With

dbNovo.Close

notas:

dbLangGeneral é valido para : Inglês,Alemão, Francês, Português, Italiano ,e Espanhol
Para o Russo a constante é  dbLangCyrillic   , para o Arabé é dbLangArabic  , etc...

As constantes possíveis são:

Constante Descrição
dbEncrypt Encripta o banco de dados
dbVersion10 Cria um banco de dados no formato Microsoft Jet 1.0
dbVersion20 Cria um banco de dados no formato Microsoft Jet 2.0
dbVersion30 Cria um banco de dados no formato Microsoft Jet 3.0
dbVersion40 Cria um banco de dados no formato Microsoft Jet 4.0

7-) Como compactar um banco de dados Access usando a DAO

Para compactar um banco de dados Access usamos o método CompactDatabase

Dim dbNovo As Database

'abre o banco de dados da versão 2.0 do Jet
Set dbsNorthwind = OpenDatabase("Nwind20.mdb")

' verifica se já existe o arquivo com o nome que vamos usar
If Dir("Nwind30.mdb") <> "" Then Kill "Nwind30.mdb"

' Compacta , encripta e altera a versão do Jet 2.0 para versão 3.o do Jet
DBEngine.CompactDatabase "Nwind20.mdb", "Nwind30.mdb", , dbEncrypt + dbVersion30

Set dbNovo = OpenDatabase("Nwind30.mdb")

 Obs: Para um arquivo protegido com senha use o seguinte código:

 DBEngine.CompactDatabase "Nwind20.mdb", "Nwind30.mdb", , dbEncrypt + dbVersion30 ,";pwd=Senha"

Leia também o artigo : Compactando um banco de dados - DAO e ADO

8-) Quais as limitações de um banco de dados da versão MS Access 97 - Versão 3.5X ?

  1. Tamanho máximo do arquivo mdb  =>   1GB
  2. Número máximo de objeto em um banco de dados =>  32768
  3. Comprimento máximo para o nome de um objeto => 64
  4. Comprimento da Senha => 14
  5. Comprimento máximo para nomes de usuários e grupos => 20
  6. Número máximo de usuários conectados ao banco de dadaos => 255
  7. Comprimento máximo do registro => 2048 
  8. Número máximo de campos na tabela => 255
  9. Número máximo de transações aninhadas => 7

9-) Como visualizar as tabelas existentes  em um banco dados Access usando DAO ?

Dim db AS DAO.Database

Dim Tabela AS DAO.TableDef

 

Set db = DBEngine.OpenDatabase("c:\teste\biblio.mdb")

 

For Each tabela in db.TableDefs

      List1.additem Tabela.Name

Next

Lista todas as tabelas e as consultas ( incluse tabelas do sistema) exibindo-as em uma caixa de listagem

10-) Como criar um tabela usando ADO ?

Dim db AS DAO.Database

Dim Tabela AS DAO.TableDef

 

Set db = DBEngine.OpenDatabase("c:\teste\biblio.mdb")

 

'Vamos criar um novo objeto tabela :  a tabela Clientes

Set Tabela = db.CreateTableDef("Clientes")

 

With Tabela

  'vamos criar os campos no objeto TableDef e depois adicionar o objeto Tabela coleção de tabelas

  'A sintaxe é : CreateField(nome_do_campo, tipo_de_dados, tamanho_campo)

   .Fields.Append .CreateField("Nome", dbText, 50)

   .Fields.Append .CreateField("Endereco", dbText , 50)

   .Fields.Append .CreateField("Telefone", dbText, 50)

End With

 

'agora inclua a nova tabela no banco de dados

db.TableDefs.Append Tabela

db.Close

Cria a tabela Clientes no banco de dados Biblio.mdb com três campos: Nome, Endereco e Telefone

11-) Como criar um índice usando DAO ?

Dim db AS DAO.Database

Dim Tabela AS DAO.TableDef

Dim Indice AS DAO.Index

 

Set db = DBEngine.OpenDatabase("c:\teste\biblio.mdb")

Set Tabela = db.TableDefs("Clientes")

 

'cria o objeto Index e inclui o objeto Field Nele: O nome do índice será NomeIdx

Set Indice=Tabela.CreateIndex("NomeIdx")

Indice.FieldsAppend Indice.CreateField("Nome")

 

'Inclui o objeto na coleção de índices

Tabela.Indexes.Append Indice

db.Close

Cria o índice NomeIdx para o campo Nome na tabela Clientes do banco de dados Biblio.mdb

12-) Como criar um consulta  usando DAO ?

Dim db AS DAO.Database

Dim Consulta AS DAO.QueryDef

 

Set db = DBEngine.OpenDatabase("c:\teste\biblio.mdb")

 

'cria a consulta TodosNomes

Set Consulta = db.CreateQueryDef("TodosNomes","Select * From Clientes")

db.Close

Cria a consulta de nome TodosNomes no banco de dados Biblio.mdb que retorna todos os registros da tabela Clientes

13-) Fechando todos os objetos de banco de dados abertos .

Para fechar todos os objetos DAO (recordsets, databases, Workspaces) antes de sair da sua aplicação ponha o código abaixo no evento Unload do formulário de saida:

Private Sub Form_Unload(Cancel As Integer)

    On Error Resume Next

    '
    Dim ws As Workspace
    Dim db As Database
    Dim rs As Recordset
    '
    For Each ws In Workspaces
        For Each db In ws.Databases
            For Each rs In db.Recordsets
                rs.Close
                Set rs = Nothing
            Next
            db.Close
            Set db = Nothing
        Next
        ws.Close
        Set ws = Nothing
    Next
    '
End Sub

14-) Criando uma chave primária em um banco de dados Access via Código.

O codigo abaixo abre o arquivo Biblio.mdb e cria a chave primária para o campo Codigo da tabela Clientes dando a ela o nome de CodigoID.

Private Sub CriaChavePrimaria()                                                       
  
Dim dbDatabase As Database
Dim dbOpened  As Database
Dim DatabasePath  as string
Dim PrimaryKey As New Index

      ' abre o banco de dados
   DatabasePath = "c:\diretorio\arquivo.mdb"    ' aqui voce informa o caminho e o nome do seu banco de dados
   Set dbOpened = OpenDatabase(DatabasePath, False, False )
  
   Set dbDatabase = dbOpened
   Set dbOpened = Nothing
                                                    
   ' Inclui a chave primária
                                                    
   BeginTrans
 
   PrimaryKey.Name = "CodigoID" 
   PrimaryKey.Fields = "Codigo"
  
   PrimaryKey.Unique = True
   PrimaryKey.Primary = True
   dbDatabase.TableDefs("Clientes").Indexes.Append PrimaryKey
   
   DoEvents
   CommitTrans
    
   dbDatabase.close                                                          
   Set dbDatabase = Nothing

End Sub

15-) Como criar um banco de dados e depois tabelas e campos ?

Abaixo o código que recebe o caminho e nome do banco de dados a criar e logo apos criar o arquivo MDB cria uma tabela chamada Exemplo com dois campos : Nome e Endereco.

Private Sub CriaDB(sDBCaminho As String)

    Dim tdExemplo As TableDef
    Dim fldNome As Field
    Dim fldEndereco As Field
    Dim dbDatabase As Database
    ' Define o novo banco de dados ( nome e caminho)
    ' Cria um arquivo .MDB vazio
    Set dbDatabase = CreateDatabase(sDBCaminho, dbLangGeneral, dbEncrypt)

    ' Cria uma nova tabela chamada Exemplo
    Set tdExemplo = dbDatabase.CreateTableDef("Exemplo")

    ' Inclui campos na tabela.
    Set fldNome = tdExemplo.CreateField("Nome", dbText, 20)
    Set fldEndereco = tdExemplo.CreateField("Endereco", dbText, 20)
    ' Inclui os campos no objeto TableDef
    tdExemplo.Fields.Append Nome
    tdExemplo.Fields.Append Endereco
    ' Salva as definições na colecao  TableDefs 
    dbDatabase.TableDefs.Append tdExemplo
    MsgBox "Arquivo MDB criado com sucesso !  "
End Sub

16-) Como criar um campo autonumeração em um tabela de um banco de dados Access ?

Para criar um campo Autonumeração , devemos criar um campo do tipo Long e , usando a propriedade Attributes definir a propriedade dbAutoinc...

 

17-) Como conseguir informações sobre a DAO ? 

A Knowledge Base da Microsoft traz uma relação de artigos sobre correções , problemas,  exemplos, etc... Vale a pena consultar. Abaixo damos uma relação de links da Knowledge Base relacionados com a DAO:

COMO FAZER
      Q232390 - Versions: VB5 VB6 Level: Intermediate
     
ACC: How to Share a Secured Database on a Network
      Q209037 - Versions: Access2K Level: Intermediate
     
ACC2000: Create and Drop Tables and Relationships Using SQL DDL
      Q202116 - Versions: VB6 Access2K Level: Intermediate
     
ACC2000: Creating a Parameterized Jet Stored Procedure with DDL
      Q210579 - Versions: VB5 VB6 Access2K Level: Intermediate
     
ACC2000: How to Change Area Codes Based on Telephone Number Prefix
      Q210174 - Versions: VB5 VB6 Level: Intermediate
     
ACC2000: How to Index an Existing Field with Data Access Objects (DAOs)
      Q210001 - Versions: VB5 VB6 Access2K Level: Intermediate
     
ACC2000: How to Programmatically Create a Schema.ini File
      Q210581 - Versions: VB5 VB6 Access2K Level: Intermediate
     
ACC2000: How to Use Code to Derive a Statistical Median
      Q209823 - Versions: VB5 VB6 Access2K Level: Intermediate
     
ACC2000: How to Use the LIKE Operator in Parameter Queries
      Q210486 - Versions: VB5 VB6 Access2K Level: Intermediate
     
ACC2000: Reading, Storing, and Writing Binary Large Objects (BLOBs)
      Q210331 - Versions: VB5 VB6 Access2K Level: Intermediate
     
ACC2000: Sample Functions to Check User and Group Information
      Q202176 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: How to Transpose Data in a Table or Query
      Q192919 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Automate a Secured Access Database Using Visual Basic
      Q177594 - Versions: VB4 VB5 VB6 Level: Intermediate
     
HOWTO: Bypass Login Prompt When Opening Linked Table
      Q146651 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Call SQL Stored Procedures from Visual Basic
      Q170961 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Change an Access Database Password
      Q249682 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Change the Datatype of a Field using Data Access Objects (DAO)
      Q217011 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Copy a DAO TableDef Including User-Defined Properties
      Q183638 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Create a Custom Text File Import Routine
      Q150418 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Create an Access Database Through Visual Basic 4.0
      Q167227 - Versions: VB4 VB5 Level: Beginner
     
HOWTO: Create and Update a Replicated Access Database
      Q150716 - Versions: VB4/32 VB5 VB6 Level: Intermediate
     
HOWTO: DAO: Attach to and Create QueryDefs on ODBC Tables
      Q129927 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Determine If a Table or Query Exists
      Q187872 - Versions: VB4/32 VB5 VB6 Level: Intermediate
     
HOWTO: Determine Jet Memory Usage with DAO MaxBufferSize
      Q200427 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Export and Import Access Tables Using DAO or ODBC
      Q190195 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Extract Information from Excel Sheet with DAO
      Q244040 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Have Your ODBC Jet 3.5 and 4.0 Applications Co-exist
      Q141796 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Identify the Jet Database Engine Components
      Q191253 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Implement Multi-user Custom Counters in DAO 3.5
      Q129879 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Import Relationships Using DAO in a VB 4.0 Program
      Q240377 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Insure Jet 3.5 Is Installed Correctly (Part I)
      Q?????? - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Insuring Jet 3.5 Is Installed Correctly (Part I)
      Q245524 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Insuring Jet 3.5 Is Installed Correctly (Part II)
      Q217213 - Versions: VB4 VB5 VB6 Level: Intermediate
     
HOWTO: Open a Password-Protected Paradox Table Using DAO
      Q163002 - Versions: VB4/32 VB5 VB6 Level: Intermediate
     
HOWTO: Open an Access Database with User Security
      Q172199 - Versions: VB4 VB5 VB6 Level: Intermediate
     
HOWTO: Optimize Queries in Visual Basic
      Q129882 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Optimize SQL Queries in Visual Basic 3.0 and 4.0
      Q172593 - Versions: VB4 VB5 VB6 Level: Intermediate
     
HOWTO: Populate DBGrid from Crosstab Parameter Query
      Q147687 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Query for Literal Special Characters in a Where Clause
      Q129744 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Query the Top N or N% records in Visual Basic
      Q233002 - Versions: VB5 VB6 Level: Beginner
     
HOWTO: Redistribute DAO 3.6
      Q177736 - Versions: VB5 Level: Intermediate
     
HOWTO: Retrieve Identity Column After Insert Using ODBCDirect
      Q146908 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Speed Up Data Access by Using BeginTrans & CommitTrans
      Q173646 - Versions: VB4/32 VB5 VB6 Level: Intermediate
     
HOWTO: Use a Custom Jet Profile to Alter Data Access Behavior
      Q170536 - Versions: VB5 VB6 Level: Intermediate
     
HOWTO: Use API to Customize DAO Registry to Close ODBC Conn
      Q129856 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Use DAO GetRows Method to Fill Variant Arrays
      Q130645 - Versions: VB4 VB5 VB6 Level: Intermediate
     
HOWTO: Use DAO to Assign or View Permissions
      Q109563 - Versions: VB4 VB5 VB6 Level: Intermediate
     
HOWTO: Use SQL Outer Join to Find All Table B Records Not in A
      Q147724 - Versions: VB4 VB5 VB6 Level: Beginner
     
HOWTO: Use TOP N Query from Microsoft Access 2.0 in VB
      Q161307 - Versions: VB4732 VB5 VB6 Level: Intermediate
     
HOWTO: Use Visual FoxPro Tables in Visual Basic
      Q200665 - Versions: VB4/32 VB5 VB6 Level: Intermediate
     
HOWTO:0: How to Change User Passwords Programmatically Using DAO

Até o próximo artigo.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti