Como associar formulários do Microsoft Access a conjuntos de registos ADO

Avançado: Requer conhecimentos avançados sobre codificação, interoperabilidade e ambiente multi-utilizador.

Este artigo aplica-se a uma base de dados do Microsoft Access (.mdb) e a um projecto do Microsoft Access (.adp).

Sumário

Este artigo descreve o que é necessário para criar um formulário actualizável associado a um objecto de conjunto de registos (Recordset) do ActiveX Data Objects (ADO).

Mais Informação

Para associar um formulário do Microsoft Access a um conjunto de registos, terá de definir a propriedade (Recordset) do formulário como um objecto de conjunto de registos (Recordset) válido do Data Access Objects (DAO) ou do ADO .

A propriedade Recordset foi introduzida no Microsoft Access 2000, e permite associar formulários a objectos de conjunto de registos Recordset do DAO ou do ADO. No entanto, os formulários do Access 2000 só podem ser do tipo actualizável se a ligação ADO for aberta usando MSDataShape e fornecedores de OLEDB para SQL Server.
Para obter informações adicionais sobre esta limitação no Access 2000, clique no número de artigo seguinte para visualizar o artigo na base de dados de conhecimento da Microsoft (KB, Microsoft Knowledge Base):
227053 ACC2000: Forms Based on ADO Recordsets Are Read-Only
No Microsoft Access 2002 ou posterior, poderá criar um formulário actualizável associado a um conjunto de registos ADO que utilize outros fornecedores de OLEDB. O formulário tem de obedecer a vários requisitos gerais para ser do tipo actualizável quando é associado a um conjunto de registos ADO. Estes requisitos gerais são:
  1. O conjunto de registos ADO subjacente tem que ser actualizável.
  2. O conjunto de registos tem que conter um ou mais campos que sejam indexados exclusivamente, tal como a chave primária de uma tabela.
Os outros requisitos necessários à capacidade de actualização variam consoante o fornecedor. Este artigo descreve os outros requisitos quando utilizar os fornecedores Microsoft SQL Server, Jet, ODBC e Oracle OLEDB.

Requisitos para Microsoft SQL Server

Existem dois requisitos principais para suportar a capacidade de actualização quando associa um formulário a um conjunto de registos ADO que esteja a utilizar dados do Microsoft SQL Server:
  • A ligação do conjunto de registos ADO deve utilizar o fornecedor de OLEDB Microsoft Access 10.0 como fornecedor de serviços.
  • A ligação do conjunto de registos ADO deve utilizar o fornecedor de OLEDB Microsoft SQL Server como fornecedor de dados.
NOTA: o fornecedor de OLEDB Microsoft Access 10.0 é um fornecedor de serviços OLEDB que foi criado especificamente para ser usado no Microsoft Access. Não foi concebido para ser utilizado noutras aplicações que não o Microsoft Access e não é suportado por outras aplicações.

Quando cria conjuntos de registos ADO no Microsoft Access, pode escolher qual a ligação ADO que será usada pelo conjunto de registos. O código ADO pode partilhar a ligação ADO que está a ser utilizada pelo Microsoft Access para a base de dados do SQL Server que esteja aberta num ficheiro de projecto (ADP) do Access, ou poderá criar uma nova ligação ADO a uma outra base de dados SQL Server através de programação.

Partilhar a ligação ADO utilizada pelo Microsoft Access

Se estiver a utilizar um ficheiro de projecto (.adp) do Access ligado a uma base de dados do Microsoft SQL Server, o código ADO poderá partilhar a ligação ADO que está a ser utilizada pelo Microsoft Access. Esta ligação é exposta pela propriedade CurrentProject.AccessConnection.

O exemplo seguinte demonstra como associar um formulário a um conjunto de registos ADO baseado em dados do SQL Server que partilha uma ligação ADO com o Microsoft Access.
  1. Abra o projecto de exemplo NorthwindCS.adp.
  2. Abra o formulário Clientes na vista Estrutura.
  3. Desmarque a propriedade OrigemDosRegistos do formulário para desassociar o formulário.
  4. Defina a propriedade OnOpen do formulário como o seguinte procedimento de evento:
    Private Sub Form_Open(Cancel As Integer)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

    'Use the ADO connection that Access uses
    Set cn = CurrentProject.AccessConnection

    'Create an instance of the ADO Recordset class, and
    'set its properties
    Set rs = New ADODB.Recordset
    With rs
    Set .ActiveConnection = cn
    .Source = "SELECT * FROM Customers"
    .LockType = adLockOptimistic
    .CursorType = adOpenKeyset
    .Open
    End With

    'Set the form's Recordset property to the ADO recordset
    Set Me.Recordset = rs

    Set rs = Nothing
    Set cn = Nothing
    End Sub
  5. Guarde e feche o formulário.
  6. Abra o formulário Clientes na vista de Formulário.
  7. Adicione, edite ou elimine um registo no formulário.
Repare que o formulário está associado a um conjunto de registos actualizáveis baseado em dados do SQL Server.

Abrir uma ligação ADO Separada

Em determinada altura, poderá precisar de abrir e gerir a sua própria ligação ADO ao SQL Server. Por exemplo, teria que utilizar esta abordagem se estivesse a escrever código numa base de dados (.mdb) ou num ficheiro de projecto (.adp) do Access que estivesse ligada a uma outra base de dados do SQL Server que não aquela a que está ligada a sua aplicação. Repare que quando usa esta abordagem, a Microsoft recomenda que feche a ligação ADO que abriu quando esta já não for necessária. Por exemplo, poderá querer fechar a ligação ADO no evento Unload do formulário.

O exemplo seguinte demonstra como abrir a sua própria ligação ADO a uma base de dados do Microsoft SQL Server e como associar um formulário à mesma:
  1. Abra a base de dados de exemplo Adamastor.mdb.
  2. Abra o formulário Clientes na vista Estrutura.
  3. Desmarque a propriedade OrigemDosRegistos do formulário para desassociar o formulário.
  4. Defina a propriedade OnOpen do formulário como o seguinte procedimento de evento:
    Private Sub Form_Open(Cancel As Integer)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

    'Create a new ADO Connection object
    Set cn = New ADODB.Connection

    'Use the Access 10 and SQL Server OLEDB providers to
    'open the Connection
    'You will need to replace MySQLServer with the name
    'of a valid SQL Server
    With cn
    .Provider = "Microsoft.Access.OLEDB.10.0"
    .Properties("Data Provider").Value = "SQLOLEDB"
    .Properties("Data Source").Value = "MySQLServer"
    .Properties("User ID").Value = "sa"
    .Properties("Password").Value = ""
    .Properties("Initial Catalog").Value = "NorthwindCS"
    .Open
    End With

    'Create an instance of the ADO Recordset class, and
    'set its properties
    Set rs = New ADODB.Recordset
    With rs
    Set .ActiveConnection = cn
    .Source = "SELECT * FROM Customers"
    .LockType = adLockOptimistic
    .CursorType = adOpenKeyset
    .Open
    End With

    'Set the form's Recordset property to the ADO recordset
    Set Me.Recordset = rs
    Set rs = Nothing
    Set cn = Nothing
    End Sub
  5. Adicione o código abaixo ao evento Unload do formulário:
    Private Sub Form_Unload(Cancel As Integer)
    'Close the ADO connection we opened
    Dim cn As ADODB.Connection
    Set cn = Me.Recordset.ActiveConnection
    cn.Close
    Set cn = Nothing
    End Sub
  6. Guarde o formulário e feche-o.
  7. Abra o formulário Clientes na vista de Formulário.
  8. Adicione, edite ou elimine um registo no formulário.
Repare que o formulário está associado a um conjunto de registos actualizáveis baseado em dados do SQL Server.

Requisitos para o Microsoft Jet

Apesar de ser possível associar um formulário a um conjunto de registos ADO que utilize dados de uma base de dados Jet, a Microsoft recomenda que utilize DAO. O DAO está optimizado para Jet e, normalmente, tem um desempenho mais rápido que o ADO quando utilizado com uma base de dados Jet.

Quando associa um formulário a um conjunto de registos ADO utilizando dados do Microsoft Jet, existem duas alternativas:
  • A propriedade LigaçãoActiva (ActiveConnection) do conjunto de registos deve utilizar o fornecedor de serviços de OLEDB Microsoft Access 10.0, assim como o fornecedor de dados OLEDB Microsoft Jet 4.0 e o conjunto de registos deve estar situado no servidor.

    - ou -
  • A propriedade LigaçãoActiva (ActiveConnection) do conjunto de registos deve utilizar apenas o servidor de dados de OLEDB Microsoft Jet 4.0 e o conjunto de registos deve estar situado no cliente.
Tal como referido anteriormente na secção "Microsoft SQL Server" deste artigo, poderá escolher qual a ligação ADO que será utilizada pelo conjunto de registos quando utilizar uma base de dados Jet. O código ADO pode partilhar a ligação ADO que está a ser utilizada pelo Microsoft Access para o ficheiro de base de dados (.mdb) Jet aberto, ou pode criar uma nova ligação ADO para um ficheiro de base de dados Jet separado através de programação.

Partilhar a ligação ADO utilizada pelo Microsoft Access

Se estiver a escrever código na mesma base de dados (.mdb) do Microsoft Access que contém os dados de que o conjunto de registos necessita, é possível ao código ADO partilhar a ligação ADO que está a ser utilizada pelo Microsoft Access. Esta ligação é exposta pela propriedade CurrentProject.AccessConnection. O exemplo seguinte demonstra como associar um formulário a um conjunto de registos ADO numa base de dados Jet, partilhando a ligação ADO que está a ser utilizada pelo Microsoft Access:
  1. Abra a base de dados de exemplo Adamastor.mdb.
  2. Abra o formulário Clientes na vista Estrutura.
  3. Desmarque a propriedade OrigemDosRegistos do formulário para desassociar o formulário.
  4. Defina a propriedade OnOpen do formulário como o seguinte procedimento de evento:
    Private Sub Form_Open(Cancel As Integer)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

    Set cn = CurrentProject.AccessConnection

    'Create an instance of the ADO Recordset class, and
    'set its properties
    Set rs = New ADODB.Recordset
    With rs
    Set .ActiveConnection = cn
    .Source = "SELECT * FROM Customers"
    .LockType = adLockOptimistic
    .CursorType = adOpenKeyset
    .CursorLocation = adUseServer
    .Open
    End With

    'Set the form's Recordset property to the ADO recordset
    Set Me.Recordset = rs
    Set rs = Nothing
    Set cn = Nothing
    End Sub
  5. Guarde o formulário e feche-o.
  6. Abra o formulário Clientes na vista de Formulário.
  7. Adicione, edite ou elimine um registo no formulário.
Repare que o formulário está associado a um conjunto de registos actualizáveis que utilizam dados Jet.

Abrir uma ligação ADO Separada

Em determinada altura, poderá precisar de abrir e gerir a sua própria ligação ADO a uma base de dados Jet. Por exemplo, teria que utilizar esta abordagem se estivesse a escrever código numa base de dados separada da base de dados que contém os dados de que necessita. Repare que quando usa esta abordagem, a Microsoft recomenda que feche a ligação ADO que abriu quando esta já não for necessária. Por exemplo, poderá querer fechar a ligação ADO no evento Unload do formulário.

O exemplo seguinte demonstra como abrir a sua própria ligação ADO a uma base de dados Microsoft Jet e como associar um formulário à mesma:
  1. Crie uma nova base de dados vazia.
  2. Importe o formulário Clientes da base de dados de exemplo Adamastor.mdb.
  3. Abra o formulário Clientes na vista Estrutura.
  4. Desmarque a propriedade OrigemDosRegistos do formulário para desassociar o formulário.
  5. Defina a propriedade OnOpen do formulário como o seguinte procedimento de evento:
    Private Sub Form_Open(Cancel As Integer)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

    'Create a new ADO Connection object
    Set cn = New ADODB.Connection

    With cn
    .Provider = "Microsoft.Access.OLEDB.10.0"
    .Properties("Data Provider").Value = "Microsoft.Jet.OLEDB.4.0"
    .Properties("Data Source").Value = _
    "C:\Program Files\Microsoft Office\Office10" & _
    "\Samples\Northwind.mdb"
    .Open
    End With

    'Create an instance of the ADO Recordset class, and
    'set its properties
    Set rs = New ADODB.Recordset
    With rs
    Set .ActiveConnection = cn
    .Source = "SELECT * FROM Customers"
    .LockType = adLockOptimistic
    .CursorType = adOpenKeyset
    .Open
    End With

    'Set the form's Recordset property to the ADO recordset
    Set Me.Recordset = rs
    Set rs = Nothing
    Set cn = Nothing
    End Sub
  6. Adicione o código abaixo ao evento Unload do formulário:
    Private Sub Form_Unload(Cancel As Integer)
    'Close the ADO connection we opened
    Dim cn As ADODB.Connection
    Set cn = Me.Recordset.ActiveConnection
    cn.Close
    Set cn = Nothing
    End Sub
  7. Guarde o formulário e feche-o.
  8. Abra o formulário Clientes na vista de Formulário.
  9. Adicione, edite ou elimine um registo no formulário.
Repare que o formulário está associado a um conjunto de registos actualizáveis que utilizam dados Jet.

Requisitos para ODBC

Quando associa um formulário a um conjunto de registos ADO que utiliza dados de uma base de dados ODBC, existem dois requisitos principais:
  • A ligação ADO utilizada pelo conjunto de registos deve utilizar o fornecedor de OLEDB Microsoft para ODBC.
  • O conjunto de registos ADO deve estar situado no cliente.
O exemplo seguinte demonstra como abrir uma ligação ADO a uma base de dados ODBC e como associar um formulário à mesma.

NOTA: Estes passos partem do princípio que a base de dados ODBC contém uma tabela CLIENTES de estrutura idêntica à tabela Clientes da base de dados de exemplo Adamastor.mdb. Também partem do princípio que foi criado um DSN ODBC chamado MyDSN que utiliza o controlador ODBC que deve ser ligado à base de dados subjacente.
  1. Abra a base de dados de exemplo Adamastor.mdb.
  2. Abra o formulário Clientes na vista Estrutura.
  3. Desmarque a propriedade OrigemDosRegistos do formulário para desassociar o formulário.
  4. Defina a propriedade OnOpen do formulário como o seguinte procedimento de evento:
    Private Sub Form_Open(Cancel As Integer)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim strConnection As String

    strConnection = "ODBC;DSN=MyDSN;UID=sa;PWD=;DATABASE=Northwind"
    'Create a new ADO Connection object
    Set cn = New ADODB.Connection

    With cn
    .Provider = "MSDASQL"
    .Properties("Data Source").Value = strConnection
    .Open
    End With

    'Create an instance of the ADO Recordset class, and
    'set its properties
    Set rs = New ADODB.Recordset
    With rs
    Set .ActiveConnection = cn
    .Source = "SELECT * FROM Customers"
    .LockType = adLockOptimistic
    .CursorType = adOpenKeyset
    .CursorLocation = adUseClient
    .Open
    End With

    'Set the form's Recordset property to the ADO recordset
    Set Me.Recordset = rs
    Set rs = Nothing
    Set cn = Nothing
    End Sub
  5. Adicione o código abaixo ao evento Unload do formulário:
    Private Sub Form_Unload(Cancel As Integer)
    'Close the ADO connection we opened
    Dim cn As ADODB.Connection
    Set cn = Me.Recordset.ActiveConnection
    cn.Close
    Set cn = Nothing
    End Sub
  6. Guarde o formulário e feche-o.
  7. Abra o formulário Clientes na vista de Formulário.
  8. Adicione, edite ou elimine um registo no formulário.
Repare que o formulário está associado a um conjunto de registos actualizáveis baseado em dados ODBC.

Requisitos para Oracle

Quando associa um formulário a um conjunto de registos ADO que utiliza dados de uma base de dados Oracle, existem dois requisitos principais:
  • A ligação ADO que é utilizada pelo conjunto de registos deve utilizar um fornecedor de OLEDB Microsoft para Oracle.
  • O conjunto de registos ADO tem que estar situado no cliente.
O exemplo seguinte demonstra como abrir uma ligação ADO a uma base de dados Oracle e como associar um formulário à mesma.

NOTA: Estes passos partem do princípio que a base de dados Oracle contém uma tabela CLIENTES de estrutura idêntica à tabela Clientes da base de dados de exemplo Adamastor.mdb.
  1. Abra a base de dados de exemplo Adamastor.mdb.
  2. Abra o formulário Clientes na vista Estrutura.
  3. Desmarque a propriedade OrigemDosRegistos do formulário para desassociar o formulário.
  4. Defina a propriedade OnOpen do formulário como o seguinte procedimento de evento:
    Private Sub Form_Open(Cancel As Integer)
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset

    'Create a new ADO Connection object
    Set cn = New ADODB.Connection

    With cn
    .Provider = "MSDAORA"
    .Properties("Data Source").Value = "MyOracleServer"
    .Properties("User ID").Value = "username"
    .Properties("Password").Value = "password"
    .Open
    End With

    'Create an instance of the ADO Recordset class, and
    'set its properties
    Set rs = New ADODB.Recordset
    With rs
    Set .ActiveConnection = cn
    .Source = "SELECT * FROM Customers"
    .LockType = adLockOptimistic
    .CursorType = adOpenKeyset
    .CursorLocation = adUseClient

    .Open
    End With

    'Set the form's Recordset property to the ADO recordset
    Set Me.Recordset = rs
    Set rs = Nothing
    Set cn = Nothing
    End Sub
  5. Adicione o código abaixo ao evento Unload do formulário:
    Private Sub Form_Unload(Cancel As Integer)
    'Close the ADO connection we opened
    Dim cn As ADODB.Connection
    Set cn = Me.Recordset.ActiveConnection
    cn.Close
    Set cn = Nothing
    End Sub
  6. Guarde o formulário e feche-o.
  7. Abra o formulário Clientes na vista de Formulário.
  8. Adicione, edite ou elimine um registo no formulário.
Repare que o formulário está associado a um conjunto de registos actualizáveis baseado em dados Oracle.

Referências

Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na base de dados de conhecimento da Microsoft (KB, Microsoft Knowledge Base):
281784 Difference Between Connection and AccessConnection Properties

Os produtos de outros fabricantes referidos neste artigo são fabricados por empresas independentes da Microsoft. A Microsoft não concede nenhuma garantia, implícita ou de outra natureza, relativamente ao desempenho ou à fiabilidade destes produtos.
Propriedades

ID do Artigo: 281998 - Última Revisão: 11/11/2008 - Revisão: 1

Comentários