Você está em: Principal › Artigos › SQL Server 2005 › Capítulo 11 : 16
Lição 197 - Capítulo 11 - O OBJETO RECORDSET
O objeto RecordSet contém 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
Com este comando selecionamos todos os registros da tabela Pedidos, os quais poderão ser acessados através de um objeto do tipo RecordSet.
• O acesso deve ser somente para leitura dos dados ou devem ser permitidas alterações e inserções de novos registros?
• 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?
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
Os parâmetros a serem passados para o método Open, estão descritos na Tabela 11.9.
Tabela 11.9 Parâmetros do método Open do objeto RecordSet.
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 Stored 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 neste 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 este argumento for algo diferente de um objeto Command ou quando o RecordSet deve ser recuperado a partir de um arquivo salvo previamente.
Um Pouco Sobre Cursores
Um cursor é o mecanismo utilizado pela tecnologia ADO para gerenciar o conjunto de registros de um objeto RecordSet. Somente podemos ter acesso a um registro por vez. Este registro é chamado de Registro corrente. Quando utilizamos o método Open, por padrão, o primeiro registro é o Registro corrente.
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 11.10. O tipo do cursor pode ser definido com um valor numérico ou através de uma constante, conforme indicado na Tabela 11.10.
Tabela 11.10 Tipos de cursores disponíveis.
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 objeto. 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 objeto 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, porém 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.
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 de hardware no servidor. 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.
Este exemplo cria um RecordSet chamado Clientes e define um cursor do tipo Static.
inst_sql="Select * from Clientes"
Clientes.Open  inst_sql,  conn, 3, 3
Ao invés de utilizarmos o valor 3, podemos utilizar a constante correspondente – adOpenStatic –, conforme o exemplo:
Clientes.Open  inst_sql,  conn,  adOpenStatic, 3
O próximo exemplo cria um RecordSet chamado Clientes e define um cursor do tipo Keyset.
Clientes.Open  inst_sql,  conn, 1, 3
Ao invés de utilizarmos o valor 1, podemos utilizar a constante correspondente – adOpenKeyset –, conforme o exemplo:
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.
Para 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 11.11 descreve os valores possíveis para esta propriedade.
Tabela 11.11 Valores para a propriedade CursorLocation.
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 OLE DB.
Nota: 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:
Ao invés de utilizarmos o valor 3, podemos utilizar a constante correspondente – adUseClient –, conforme o exemplo:
Quando criamos um objeto 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 invés de utilizarmos o valor 2, podemos utilizar a constante correspondente – adUseServer –, conforme o exemplo:
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 acessa 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 11.12
Tabela 11.12 Tipos de Lock.
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 registro 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.
Nota: A propriedade LockType deve ser definida antes da utilização do método Open. Ao tentarmos definir a propriedade LockType, com o RecordSet aberto, obteremos a seguinte mensagem de erro:
A mensagem indica que a operação (definir o tipo de Lock) 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:
Propriedades do Objeto RecordSet
<%  RecordSet.nome_da_propriedade = valor %>
Na Tabela 11.13 estão listadas as principais propriedades do objeto RecordSet.
Tabela 11.13 Principais propriedades do objeto RecordSet.
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.
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 utilizado para definir o tipo de cursor. Deve ser usado 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.
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 utilizado para filtrar os registros de um RecordSet de acordo com um critério definido.
LockType - Indica o tipo de Lock que está sendo utilizado. Também pode ser utilizado 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.
Métodos do Objeto RecordSet
<% RecordSet.nome_do_método parâmetro1, parâmetro2, ...,  parâmetron %>
Na Tabela 11.14 estão listados os principais métodos do objeto RecordSet.
Tabela 11.14 Principais métodos do objeto RecordSet.
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.
CancelUpdate Cancela qualquer alteração feita no registro corrente, ou alterações feitas em um novo registro antes da chamada ao 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.
Open - Abre o objeto RecordSet.
Requery - Atualiza o conjunto de registros do RecordSet, executando novamente a consulta que deu origem ao RecordSet.