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

vai continuar...


 José Carlos Macoratti