NUNCA MAIS PASSE RAIVA POR NÃO CONSEGUIR RESOLVER UM PROBLEMA COM O EXCEL - GARANTIDO!

UNIVERSIDADE DO VBA - Domine o VBA no Excel Criando Sistemas Completos - Passo a Passo - CLIQUE AQUI

Você está em: PrincipalArtigos › ASP 3.0 › Capítulo 06 : 04
Quer receber novidades e e-books gratuitos?
« Lição anterior Δ Página principal ¤ Capítulos Próxima lição »
SITES DINÂMICOS COM ASP 3.0 - CURSO COMPLETO
Autor: Júlio Battisti


Promoção: Livro Windows Server 2012 R2 e Active Directory - Curso Completo, 2100 Páginas. Tudo para você se tornar um administrador de redes altamente qualificado para o mercado de trabalho e levar a sua carreira para o próximo nível!

Promoção: Livro Windows Server 2012 R2 e Active Directory

Curso Completo, 2100 páginas.

Tudo para você se tornar um administrador de redes altamente qualificado para o mercado de trabalho e levar a sua carreira para o próximo nível!

MAIS DETALHES | COMPRAR ESTE LIVRO


Lição 048 - Capítulo 06 - O Objeto RecordSet

Nos exemplos que foram apresentados até aqui, já utilizamos o objeto RecordSet. Agora chegou o momento de fazer um estudo mais aprofundado deste objeto.

O objeto RecordSet contem  o resultado de uma instrução SQL, executada em um Banco de dados. Um objeto RecordSet contém um conjunto de Registros. É como se fosse uma tabela, onde cada linha é um registro, sendo que cada registro é formado por um conjunto de campos (colunas da tabela). Por exemplo, ao executarmos a seguinte instrução SQL:

Select * from Pedidos

Estaremos selecionando todos os registros da tabela Pedidos, os quais poderão ser acessados através de um objeto do tipo RecordSet.

Existem detalhes importantes que devemos conhecer a respeito do acesso aos dados. Devemos considerar questões como:

  • O acesso deve ser somente para leitura dos dados ou devem ser permitidas alterações e inserções de novos dados?
  • Como tratar questões sobre o acesso simultâneo aos dados. Por exemplo, como tratar a situação em que dois usuários tentam alterar o mesmo registro, ao mesmo tempo ?

Estas são questões importantes e devem ser consideradas sempre que formos disponibilizar acesso aos dados da nossa empresa, para usuários da Internet. Também precisamos conhecer o que são Cursores, quais os tipos de Cursores disponíveis e para que utilizamos Cursores. Vamos estudar estes pontos neste tópico.

Para criar um objeto RecordSet, utilizamos a seguinte sintaxe:

Set Pedidos = Server.CreateObject("ADODB.Recordset")

Neste exemplo estamos criando um RecordSet chamado Pedidos. Uma vez criado o RecordSet, o próximo passo é utilizarmos o método Open. O método Open possui a seguinte sintaxe:

recordset.Open  Source,   ActiveConnection,   CursorType,   LockType,   Options

Considere o exemplo:

Pedidos.Open inst_sql, conn, 3, 3

Os parâmetros a serem passados para o método Open, estão descritos na Tabela 6.5.

Parâmetro Descrição
Source Pode ser o nome de um objeto Command, uma instrução SQL ou o nome de uma variável que contém uma instrução SQL, o nome de uma tabela ou de um Store Procedure do Banco de dados ou até uma URL que aponta para uma fonte de dados.
ActiveConnection O nome da conexão a ser utilizada ou a String de Conexão para uma fonte de dados ODBC ou OLE DB. É opcional.
CursorType É um valor que determina o tipo de cursor que será utilizado pelo Provedor de dados na abertura do RecordSet. É opcional. Falaremos mais sobre tipos de cursores ainda item.
LockType É um valor que determina o tipo de lock que será utilizado pelo Provedor de dados na abertura do RecordSet. É opcional. Falaremos mais sobre tipos de lock ainda neste item.
Options Um valor do tipo Long, o qual define como o Provedor de dados deve avaliar o argumento Source, quando o mesmo for algo diferente de um objeto Command ou quando o RecordSet deve ser recuperado a partir de um arquivo salvo previamente.

Tabela 6.5 Parâmetros do método Open do objeto RecordSet.

Cursores.

Um Cursor é o mecanismo utilizado em ADO para gerenciar o conjunto de registros de um objeto RecordSet. Somente podemos ter acesso a um registro do conjunto de registros de um objeto RecordSet. Este registro é chamado de Registro corrente. Quando utilizamos o método Open, por padrão, o primeiro registro é o Registro corrente.

Um cursor também é utilizado para determinar qual o Registro corrente, bem como para movimentar o Indicador de registro entre os diversos registros do objeto RecordSet. O mecanismo que identifica qual é o Registro corrente é chamado de “Record pointer”. Quem lida com a manipulação do Record pointer é o cursor. Por isso quando utilizamos os métodos MoveNext (mover para o próximo registro), MovePrevious (mover para o registro anterior) ou qualquer outro método de movimentação, estamos utilizando o cursor.

O mecanismo do cursor também gerencia situações em que tentamos avançar além do último registro ou voltar além do primeiro registro, ou quando acessamos o valor de um campo de um registro. De uma maneira simples, podemos afirmar que grande parte da funcionalidade de um objeto RecordSet é fornecida pelo mecanismo do cursor.

Quando utilizamos o método Open, podemos definir diferentes formas de comportamento para o mecanismo do cursor. Estas formas de comportamento é que determinam os tipos de cursores disponíveis, os quais estão descritos na Tabela 6. 6. O tipo do cursor pode ser definido com um valor numérico ou através de uma constante, conforme indicado na Tabela 6.6.

Valor/Constante Tipo/Descrição
3
adOpenStatic
Define um cursor  do tipo Static. Um cursor deste tipo contém uma cópia estática dos registros. O conteúdo do RecordSet é definido no momento da criação do mesmo. Caso sejam feitas alterações no Banco de dados, estas alterações não serão visíveis para o RecordSet que utiliza um cursor do tipo Static. Somente recriando o RecordSet é que poderemos ter acesso as alterações efetuadas. Podemos movimentar o ponteiro de registro em ambas as direções, isto é, podemos utilizar os métodos MoveNext, MovePrevious e assim por diante.
0
adOpenForwardOnly
Cria um cursor do tipo Forward Only. Este é o valor padrão que será utilizado caso não seja definido nenhum outro tipo. Somente podemos utilizar o método MoveNext. Se tentarmos utilizar um outro método de movimentação, será gerado um erro e a página não será carregada. Também é um cursor do tipo Static, com a diferença que somente podemos nos movimentar para a frente.
2
adOpenDynamic
Cria um cursor do tipo Dynamic. Um cursor deste tipo não possui um conjunto fixo de registros. Quaisquer alterações, adições e exclusões feitas por outros usuários serão visíveis para o objeto RecordSet,  sem que o mesmo tenha que ser eliminado e recriado. Podemos nos movimentar em ambas as direções dentro do RecordSet.
1
adOpenKeyset
Cria um cursor do tipo Keyset. Um cursor deste tipo é parecido com um cursor Dynamic, com a exceção de que o conjunto de registros é fixo. O RecordSet enxerga as alterações feitas por outros usuários, porem a adição de novos registros não é visível para um RecordSet do tipo Keyset. Caso algum registro seja eliminado por outros usuários, o respectivo registro estará inacessível no RecordSet. Podemos nos movimentar em ambas as direções dentro do RecordSet.

Tabela 6.6 Tipos de cursores disponíveis.

O tipo de Cursor a ser utilizado depende da aplicação que estamos desenvolvendo. Por exemplo, se estamos desenvolvendo uma página ASP apenas para exibir um conjunto de registros, podemos utilizar um cursor do tipo Static. Cursores mais simples, como o do tipo Static, consomem menos recursos. Cursores mais sofisticados, como o do tipo Dynamic, consomem mais recursos computacionais. Estes recursos podem ser consumidos na estação do Cliente ou no Servidor Web, dependendo da localização do Cursor. Veremos como definir a localização do Cursor através da utilização da propriedade CursorLocation, no próximo item.

Agora alguns exemplos de utilização do método Open.

Este exemplo, cria um RecordSet chamado Clientes e define um cursor do tipo Static.

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.Open  inst_sql,   conn,   3,   3

%> 

Ao invés de utilizarmos o valor 3, podemos utilizar a constante correspondente - adOpenStatic, conforme o exemplo:

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.Open  inst_sql,   conn,  adOpenStatic,   3

%>

O próximo exemplo, cria um RecordSet chamado Clientes e define um cursor do tipo Keyset.

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.Open  inst_sql,   conn,   1,   3

%>

Ao invés de utilizarmos o valor 1, podemos utilizar a constante correspondente - adOpenKeyset, conforme o exemplo:

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.Open  inst_sql,   conn,  adOpenKeyset,   3

%>

Localização do Cursor.

O cursor pode estar localizado no Servidor Web ou no Cliente que está acessando os dados. Algumas fontes de dados, como o Microsoft SQL Server podem oferecer serviços de cursor no Servidor. O Microsoft Access não oferece serviços de cursor, com isso o cursor fica localizado no cliente. Quando acessamos fontes de dados, utilizando OLE DB podemos utilizar o serviço de cursor oferecido pelo próprio OLE DB. A opção padrão, caso não seja definido nada em contrário, é que o cursor esteja no Servidor.

Definir a localização do cursor, devemos utilizar a propriedade CursorLocation, do objeto RecordSet. Definimos esta propriedade antes da utilização do método Open do objeto RecordSet. A Tabela 6.7 descreve os valores possíveis para esta propriedade.

Valor/Constante Tipo/Descrição
3
adUseClient
Utiliza serviços de cursor no cliente.
1
adUseNone
Não utiliza serviços de cursor.  Somente é mantido por questões de compatibilidade com as versões anteriores.
2
adUseServer
Utiliza serviços de cursor do Servidor ou do Provedor OLEDB.

Tabela 6.7 Valores para a propriedade CursorLocation.

No próximo exemplo, definimos o cursor no Cliente:

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.CursorLocation = 3

Clientes.Open  inst_sql,   conn,   3,   3

%>

A propriedade CursorLocation deve ser definida antes da utilização do método Open. Ao tentarmos definir a propriedade CursorLocation, com o RecordSet aberto, obteremos a seguinte mensagem de erro:

Tipo de erro:
ADODB.Recordset (0x800A0E79)
Operation is not allowed when the object is open.
/capitulo06/04.asp, line 40

A mensagem indica que a operação (definir a localização do cursor) não é permitida quando o objeto está aberto.

Ao invés de utilizarmos o valor 3, podemos utilizar a constante correspondente - adUseClient, conforme o exemplo:

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.CursorLocation = adUseClient

Clientes.Open  inst_sql,   conn,  adOpenStatic,   3

%>

Quando criamos um RecordSet com o cursor no Servidor, é responsabilidade do Servidor gerenciar a navegação e as atualizações do RecordSet, sendo que serão consumidos recursos no Servidor.

Ao utilizar o cursor no Cliente, todo o conteúdo do RecordSet é copiado para a estação do Cliente e gerenciado por um cursor local. Devemos considerar a questão da velocidade da conexão do usuário com a Internet ou com a Intranet da empresa, pois se o RecordSet for muito grande, isto é, um grande número de registros, o tempo para copiar todo o RecordSet, pode ser inaceitável. Porém uma vez copiado o RecordSet para a estação do Cliente, a utilização do RecordSet é mais rápida, pois não é preciso acessar o Servidor para simples operações, tais como movimentar-se para o próximo registro.

Quando uma aplicação Web é desenvolvida, a localização dos cursores deve ser discutida na fase de projeto, sempre procurando propiciar o melhor desempenho possível para a aplicação. Em uma mesma aplicação posso ter páginas que utilizam o cursor no Servidor e outras que utilizam o cursor no Cliente, depende apenas da natureza de cada página.

No próximo exemplo, definimos o cursor no Servidor:

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.CursorLocation = 2

Clientes.Open  inst_sql,   conn,   3,   3

%>

Ao invés de utilizarmos o valor 2, podemos utilizar a constante correspondente - adUseServer, conforme o exemplo:

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.CursorLocation = adUseServer

Clientes.Open  inst_sql,   conn,  adOpenStatic,   3

%>

Lembrando que não é necessário definir o cursor no Servidor, pois essa é a definição padrão, ou seja, se não for definida, explicitamente, a propriedade CursorLocation assume o valor adUseServer.

Lock de registros.

Os Banco de dados utilizam o Lock de registros como uma maneira de garantir a integridade dos dados. Com a utilização do Lock garantimos que um mesmo registro não esteja sendo alterado, simultaneamente, por mais do que um usuário. Quando um usuário acesso um registro para fazer alguma alteração, o registro é bloqueado, de tal forma que outros usuários não possam ter acesso ao registro. O acesso ao registro somente será liberado após as alterações terem sido salvas no Banco de dados. O tipo de Lock é definido pela propriedade LockType do objeto RecordSet.  Existem diferentes maneiras de se fazer o Lock dos registros, conforme descrito na Tabela 6.8

Valor/Constante Tipo/Descrição
1
adLockReadOnly
Cria um Lock do tipo Read Only.É o tipo padrão de lock. O RecordSet é somente leitura, isto é, os registros não podem ser modificados, logo não precisam ser bloqueados. Com isso tenho um processamento mais rápido, porém perco a capacidade de fazer alterações nos registros.
2
adLockPessimistic
Cria um Lock do tipo Pessimistic. O Provedor OLE DB tenta bloquear o registro no momento em que o mesmo começa a ser editado. Isso é feito para tentar garantir que o registro será editado com sucesso.
3
adLockOptimistic
Cria um Lock do tipo Optimistic. O registro não é bloqueado enquanto as alterações no registro não forem salvas no Banco de dados através da utilização do método Update do RecordSet.
4
adLockBatchOptimistic
Cria um Lock do tipo Batch Optimistic. Este tipo de Lock permite que vários registros sejam modificados. Os registros somente serão bloqueados quando for chamado o método UpdateBatch do objeto RecordSet.
-1
adLockUnspecified
Não define o tipo de Lock. Quando utilizamos o método Clone, para criar uma cópia do RecordSet, o Clone será criado com o mesmo tipo de Lock do RecordSet original.

Tabela 6.8 Tipos de Lock.

A maneira e os tipos de Lock possíveis de serem utilizados, também dependem da fonte de dados que está sendo utilizada. Quando não existe a necessidade de fazer alterações nos registros, devemos utilizar, sempre, um Lock do tipo Read Only (ou seja, como o RecordSet é apenas leitura, os registros não precisam ser bloqueados), pois isso evita que o Provider tenha que fazer verificações ao acessar cada registro, para verificar se o registro não está bloqueado no momento. Com isso teremos um processamento bem mais rápido.

Um registro bloqueado não pode nem sequer ser visualizado pelos usuários, com isso evita-se que seja exibido um registro que está sendo alterado.

Para definir o tipo de Lock, utilizamos a propriedade LockType, conforme indicado no exemplo a seguir, onde definimos o tipo de Lock como Optimistic:

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.LockType = 3

Clientes.Open  inst_sql,   conn,   3,   3

%>

A propriedade LockType deve ser definida antes da utilização do método Open. Ao tentarmos definir a propriedade CursorLocation, com o RecordSet aberto, obteremos a seguinte mensagem de erro:

Tipo de erro:
ADODB.Recordset (0x800A0E79)
Operation is not allowed when the object is open.
/capitulo06/04.asp, line 40

A mensagem indica que a operação (definir a localização do cursor) não é permitida quando o objeto está aberto.

Ao invés de utilizarmos o valor 3, podemos utilizar a constante correspondente - adLockOptimistic, conforme o exemplo:

<%

inst_sql=”Select * from Clientes”

Set Clientes = Server.CreateObject("ADODB.Recordset")

Clientes.LockType = adLockOptimistic

Clientes.Open  inst_sql,   conn,  adOpenStatic,   3

%>

Agora que já discutimos um pouco sobre Cursores, localização do Cursor e Lock de registros, podemos partir para o estudo de mais alguns detalhes do objeto RecordSet.

Propriedades do objeto RecordSet.

Através da utilização de propriedades de um objeto podemos definir algumas características do objeto e também retornar as características do objeto. Algumas propriedades são somente para leitura, isto significa que apenas podemos verificar o valor da propriedade. Outras propriedades são de leitura e escrita, isto é, podemos definir o valor da propriedade. Para definir o valor de uma propriedade, utilizamos a seguinte sintaxe:

<% RecordSet.nome_da_propriedade = valor %>

Na Tabela 6.9 estão listadas as principais propriedades do objeto RecordSet.

Propriedade Descrição
AbsolutePage Retorna a página do Registro corrente. Página é um conceito de armazenamento de Banco de dados.
AbsolutePosition Indica a posição do Registro corrente, dentro do RecordSet.
ActiveCommand Retorna o objeto Command utilizado para criar o RecordSet, caso tenha sido utilizado um objeto Command. Esta propriedade é somente leitura.
BOF Esta propriedade torna-se verdadeira quando estivermos no primeiro registro e utilizarmos o método MovePrevious, ou seja, indica uma tentativa de voltarmos além do primeiro registro. É somente leitura.
Bookmark Retorna um marcador (bookmark) que identifica de maneira única cada registro do RecordSet. Também pode ser utilizado para tornar o registro identificado pelo BookMark como o registro corrente. Nem todos as fontes de dados e seus respectivos OLE DB Providers oferecem esta propriedade.
CacheSize Indica o número de registros do RecordSet que devem ser mantidos no cache local de memória. Também pode ser utilizada para definir este número de registros.
CursorLocation Pode ser utilizada para definir ou retornar a posição do cursor.
CursorType Indica o tipo de cursor utilizado em um objeto RecordSet. Também pode ser utiliza para definir o tipo de cursor. Deve ser utilizada antes do método Open, caso contrário irá provocar um erro quando a página for carregada.
EditMode Retorna um valor que indica o status de edição do registro atual. Este valor pode ser: 0 – indica que não existe edição em andamento; 1- indica que os dados do registro atual foram modificados, porém ainda não foram salvos; 2 – indica que o método AddNew foi chamado e o registro que está sendo criado, ainda não foi salvo no Banco de dados; 4  – indica que o registro atual foi deletado. É somente leitura.
EOF Esta propriedade torna-se verdadeira quando estivermos no último registro e utilizarmos o método MoveNext, ou seja, indica uma tentativa de avançarmos além do último registro. É somente leitura.
Filter Pode ser utilizada para filtrar os registros de um RecordSet de acordo com um critério definido. Falaremos mais sobre esta propriedade mais adiante. Também serão mostrados alguns exemplos práticos.
LockType Indica o tipo de Lock que está sendo utilizado. Também pode ser utilizada para definir o tipo de Lock, antes que o método Open tenha sido utilizado.
MaxRecords Define o número máximo de registros que uma consulta deve retornar para o objeto RecordSet. O valor padrão é zero, o que significa sem limite de registros.
PageCount Indica quantas páginas de dados o objeto RecordSet contém. É somente leitura.
PageSize Indica o número de registros por página.
RecordCount Indica o número de registros do objeto RecordSet. É somente leitura.
Sort Especifica um ou mais campos para ordenação do RecordSet, além do tipo de ordenação se ascendente ou descendente. Para utilizarmos esta propriedade devemos utilizar o Cursor no cliente.
Source Indica as fontes dos dados de um objeto RecordSet. Por exemplo, exibe a instrução SQL que deu origem aos dados ou o nome da tabela ou consulta que originou os dados do objeto RecordSet.
State Indica o estado do objeto RecordSet. Indica se o mesmo está aberto, fechado ou executando uma operação de maneira assíncrona. É somente leitura.

Tabela 6.9 - Principais propriedades do Objeto RecordSet.

Métodos do objeto RecordSet.

O objeto RecordSet nos fornece diversos métodos, os quais podem ser utilizados para nos deslocar através dos registros, fazer uma cópia do RecordSet, etc. Para utilizarmos um método do objeto RecordSet, utilizamos a seguinte sintaxe:

<% RecordSet.nome_do_método parâmetro1, parâmetro2, ..., parâmetron  %>

Na Tabela 6.10 estão listados os principais métodos do objeto RecordSet.

Método Descrição
AddNew Utilizado para adicionar um novo registro em um RecordSet que seja atualizável.
Cancel Cancela a execução de uma operação Open assíncrona.
CancelBatch Cancela uma operação de atualização em Batch.
CancelUpdate Cancela qualquer alteração feita no registro corrente, ou alterações feitas em um novo registro antes da chamada do método Update.
Clone Cria uma cópia do objeto RecordSet.
Close Fecha o objeto RecordSet e todos os objetos dele dependentes.
Delete Elimina o registro corrente ou um grupo de registros selecionados.
Find Pesquisa no RecordSet por um registro que atende um critério especificado.
GetRows Retorna registros de um RecordSet e os armazena em um array.
GetString Retorna todo o RecordSet como uma String.
Move Movimenta o indicador de registro a partir de uma posição especificada um determinado número de registros. Por exemplo, posso movimentar o indicador dez registros a partir do registro 10, com isso o indicador fica no registro 20.
MoveFirst Movimenta o indicador para o primeiro registro.
MoveLast Movimenta o indicador para o último registro.
MoveNext Movimenta o indicador para o próximo registro.
MovePrevious Movimenta o indicador para o registro anterior.
Open Abre o objeto RecordSet.
Requery Atualiza o conjunto de registros do RecordSet, executando novamente a consulta que deu origem ao RecordSet.
Resync Atualiza os dados do RecordSet, buscando os dados a partir do Banco de dados.
Save Salva o conteúdo do RecordSet em um arquivo.
Update Salva quaisquer alterações que tenham sido feitas para o objeto RecordSet.

Tabela 6.10 - Principais métodos do Objeto RecordSet.

Agora vamos aprender a executar algumas operações bastante comuns em aplicações Web do dia a dia. Aprenderemos a inserir registros, excluir registros e alterar um determinado registro.


Promoção: Livro Windows Server 2012 R2 e Active Directory - Curso Completo, 2100 Páginas. Tudo para você se tornar um administrador de redes altamente qualificado para o mercado de trabalho e levar a sua carreira para o próximo nível!

Promoção: Livro Windows Server 2012 R2 e Active Directory

Curso Completo, 2100 páginas.

Tudo para você se tornar um administrador de redes altamente qualificado para o mercado de trabalho e levar a sua carreira para o próximo nível!

MAIS DETALHES | COMPRAR ESTE LIVRO


« Lição anterior Δ Página principal ¤ Capítulos Próxima lição »
Quer receber novidades e e-books gratuitos?

Cursos Online

  • Banco de Dados
  • Carreira
  • Criação/Web
  • Excel/Projetos
  • Formação
  • + Todas as categorias
  • Contato: Telefone: (51) 3717-3796 | E-mail: webmaster@juliobattisti.com.br | Whatsapp: (51) 99627-3434

    Júlio Battisti Livros e Cursos Ltda | CNPJ: 08.916.484/0001-25 | Rua Vereador Ivo Cláudio Weigel, 537 - Universitário, Santa Cruz do Sul/RS, CEP: 96816-208

    Todos os direitos reservados, Júlio Battisti 2001-2019 ®

    [LIVRO]: MACROS E PROGRAMAÇÃO VBA NO EXCEL 2010 - PASSO-A-PASSO

    APRENDA COM JULIO BATTISTI - 1124 PÁGINAS: CLIQUE AQUI