Classe CRecordset
Representa um conjunto de registros selecionados de uma fonte de dados.
Sintaxe
class CRecordset : public CObject
Membros
Construtores públicos
Nome | Descrição |
---|---|
CRecordset::CRecordset |
Constrói um objeto CRecordset . Sua classe derivada deve fornecer um construtor que chame este. |
Métodos públicos
Nome | Descrição |
---|---|
CRecordset::AddNew |
Prepara-se para adicionar um novo registro. Chame Update para concluir a adição. |
CRecordset::CanAppend |
Retorna diferente de zero se novos registros puderem ser adicionados ao conjunto de registros por meio da função de membro AddNew . |
CRecordset::CanBookmark |
Retornará diferente de zero se o conjunto de registros der suporte a indicadores. |
CRecordset::Cancel |
Cancela uma operação assíncrona ou um processo de um segundo thread. |
CRecordset::CancelUpdate |
Cancela todas as atualizações pendentes devido a uma operação AddNew ou Edit . |
CRecordset::CanRestart |
Retorna diferente de zero se Requery puder ser chamado para executar a consulta do conjunto de registros novamente. |
CRecordset::CanScroll |
Retorna diferente de zero se você puder percorrer os registros. |
CRecordset::CanTransact |
Retornará diferente de zero se a fonte de dados der suporte a transações. |
CRecordset::CanUpdate |
Retornará diferente de zero se o conjunto de registros puder ser atualizado (você pode adicionar, atualizar ou excluir registros). |
CRecordset::CheckRowsetError |
Chamado para lidar com erros gerados durante a busca de registros. |
CRecordset::Close |
Fecha o conjunto de registros e o ODBC HSTMT associado a ele. |
CRecordset::Delete |
Exclui o registro atual do conjunto de registros. Você deve avançar explicitamente para outro registro após a exclusão. |
CRecordset::DoBulkFieldExchange |
Chamado para trocar linhas em massa de dados da fonte de dados para o conjunto de registros. Implementa a troca de campo de registro em massa (RFX em massa). |
CRecordset::DoFieldExchange |
Chamado para trocar dados (em ambas as direções) entre os membros de dados de campo do conjunto de registros e o registro correspondente na fonte de dados. Implementa a troca de campo de registro (RFX). |
CRecordset::Edit |
Prepara-se para alterações no registro atual. Chame Update para concluir a edição. |
CRecordset::FlushResultSet |
Retorna diferente de zero se houver outro conjunto de resultados a ser recuperado ao usar uma consulta predefinida. |
CRecordset::GetBookmark |
Atribui o valor de indicador de um registro ao objeto de parâmetro. |
CRecordset::GetDefaultConnect |
Chamado para obter a cadeia de conexão padrão. |
CRecordset::GetDefaultSQL |
Chamado para obter a cadeia de caracteres SQL padrão a ser executada. |
CRecordset::GetFieldValue |
Retorna o valor de um campo em um conjunto de registros. |
CRecordset::GetODBCFieldCount |
Obtém o número de campos no conjunto de registros. |
CRecordset::GetODBCFieldInfo |
Retorna tipos específicos de informações sobre os campos em um conjunto de registros. |
CRecordset::GetRecordCount |
Retorna o número de registros no conjunto de registros. |
CRecordset::GetRowsetSize |
Retorna o número de registros que você deseja recuperar durante uma única busca. |
CRecordset::GetRowsFetched |
Retorna o número real de linhas recuperadas durante uma busca. |
CRecordset::GetRowStatus |
Retorna o status da linha após uma busca. |
CRecordset::GetSQL |
Obtém a cadeia de caracteres SQL usada para selecionar registros para o conjunto de registros. |
CRecordset::GetStatus |
Obtém o status do conjunto de registros: o índice do registro atual e se uma contagem final dos registros foi obtida. |
CRecordset::GetTableName |
Obtém o nome da tabela na qual o conjunto de registros está baseada. |
CRecordset::IsBOF |
Retornará diferente de zero se o conjunto de registros tiver sido posicionado antes do primeiro registro. Não há registro atual. |
CRecordset::IsDeleted |
Retornará diferente de zero se o conjunto de registros estiver posicionado em um registro excluído. |
CRecordset::IsEOF |
Retornará diferente de zero se o conjunto de registros tiver sido posicionado depois do último registro. Não há registro atual. |
CRecordset::IsFieldDirty |
Retornará diferente de zero se o campo especificado no registro atual tiver sido alterado. |
CRecordset::IsFieldNull |
Retornará diferente de zero se o campo especificado no registro atual for nulo (sem valor). |
CRecordset::IsFieldNullable |
Retornará diferente de zero se o campo especificado no registro atual puder ser definido como nulo (sem valor). |
CRecordset::IsOpen |
Retornará diferente de zero se Open tiver sido chamado anteriormente. |
CRecordset::Move |
Posiciona o conjunto de registros para um número especificado de registros do registro atual em qualquer direção. |
CRecordset::MoveFirst |
Posiciona o registro atual no primeiro registro no conjunto de registros. Teste para IsBOF primeiro. |
CRecordset::MoveLast |
Posiciona o registro atual no último registro ou no último conjunto de linhas. Teste para IsEOF primeiro. |
CRecordset::MoveNext |
Posiciona o registro atual no próximo registro ou no próximo conjunto de linhas. Teste para IsEOF primeiro. |
CRecordset::MovePrev |
Posiciona o registro atual no registro anterior ou no conjunto de linhas anterior. Teste para IsBOF primeiro. |
CRecordset::OnSetOptions |
Chamado para definir opções (usadas na seleção) para a instrução ODBC especificada. |
CRecordset::OnSetUpdateOptions |
Chamado para definir opções (usadas na atualização) para a instrução ODBC especificada. |
CRecordset::Open |
Abre o conjunto de registros recuperando a tabela ou executando a consulta que o conjunto de registros representa. |
CRecordset::RefreshRowset |
Atualiza os dados e o status das linhas especificadas. |
CRecordset::Requery |
Executa a consulta do conjunto de registros novamente para atualizar os registros selecionados. |
CRecordset::SetAbsolutePosition |
Posiciona o conjunto de registros no registro correspondente ao número de registro especificado. |
CRecordset::SetBookmark |
Posiciona o conjunto de registros no registro especificado pelo indicador. |
CRecordset::SetFieldDirty |
Marca o campo especificado no registro atual conforme alterado. |
CRecordset::SetFieldNull |
Define o valor do campo especificado no registro atual como Nulo (sem valor). |
CRecordset::SetLockingMode |
Define o modo de bloqueio como bloqueio "otimista" (o padrão) ou bloqueio "pessimista". Determina como os registros são bloqueados para atualizações. |
CRecordset::SetParamNull |
Define o valor atual do parâmetro especificado como Null (sem valor). |
CRecordset::SetRowsetCursorPosition |
Posiciona o cursor na linha especificada dentro do conjunto de linhas. |
CRecordset::SetRowsetSize |
Especifica o número de registros que você deseja recuperar durante uma busca. |
CRecordset::Update |
Conclui uma operação AddNew ou Edit salvando os dados novos ou editados na fonte de dados. |
Membros de dados públicos
Nome | Descrição |
---|---|
CRecordset::m_hstmt |
Contém o identificador de instrução ODBC do conjunto de registros. Digite HSTMT . |
CRecordset::m_nFields |
Contém o número de membros de dados de campo no conjunto de registros. Digite UINT . |
CRecordset::m_nParams |
Contém o número de membros de dados de parâmetro no conjunto de registros. Digite UINT . |
CRecordset::m_pDatabase |
Contém um ponteiro para o objeto CDatabase por meio do qual o conjunto de registros está conectado a uma fonte de dados. |
CRecordset::m_strFilter |
Contém um CString que especifica uma cláusula WHERE da linguagem SQL (SQL). Usado como um filtro para selecionar apenas os registros que atendem a determinados critérios. |
CRecordset::m_strSort |
Contém uma CString que especifica uma cláusula ORDER BY SQL. Usada para controlar como os registros são classificados. |
Comentários
Conhecidos como "conjuntos de registros", os objetos CRecordset
normalmente são usados em duas formas: dynasets e snapshots. Um dynaset permanece sincronizado com as atualizações de dados feitas por outros usuários. Um snapshot é uma exibição estática dos dados. Cada forma representa um conjunto de registros corrigidos no momento em que o conjunto de registros é aberto. Quando você rola até um registro em um dynaset, ele reflete as alterações feitas no registro, por outros usuários ou por outros conjuntos de registros em seu aplicativo.
Observação
Se você estiver trabalhando com as classes DAO (Data Access Objects) em vez das classes ODBC (Open Database Connectivity), use a classe a CDaoRecordset
. Para obter mais informações, consulte Visão geral: Programação de banco de dados.
Para trabalhar com qualquer tipo de conjunto de registros, normalmente você deriva de CRecordset
uma classe de conjunto de registros específica do aplicativo. Os conjuntos de registros selecionam registros de uma fonte de dados e, em seguida, você pode:
Percorra os registros.
Atualizar os registros e especifique um modo de bloqueio.
Filtrar o conjunto de registros para restringir quais registros ele seleciona dentre os disponíveis na fonte de dados.
Organizar o conjunto de registros.
Parametrizar o conjunto de registros para personalizar sua seleção com informações não conhecidas até o tempo de execução.
Para usar sua classe, abra um banco de dados e construa um objeto de conjunto de registros, passando no construtor um ponteiro para o objeto CDatabase
. Em seguida, chame a função de membro Open
do conjunto de registros, na qual você pode especificar se o objeto é um dynaset ou um snapshot. Chamar Open
seleciona dados da fonte de dados. Depois que o objeto recordset for aberto, use suas funções de membro e membros de dados para percorrer os registros e operá-los. As operações disponíveis dependem de o objeto ser um dynaset ou um snapshot, atualizável ou somente leitura [isso depende da funcionalidade da fonte de dados ODBC (Open Database Connectivity)] e se você implementou a busca de linhas em massa. Para atualizar registros que podem ter sido alterados ou adicionados desde a chamada de Open
, chame a função de membro Requery
do objeto. Chame a função de membro Close
do objeto e destrua o objeto quando terminar.
Em uma classe derivada CRecordset
, a troca de campo de registro (RFX) ou troca de campo de registro em massa (RFX em massa) é usada para dar suporte à leitura e à atualização de campos de registro.
Para obter mais informações sobre conjuntos de registros e troca de campos de registro, consulte os artigos Visão geral: Programação de banco de dados, Conjunto de registros (ODBC),, Conjunto de registros: buscando registros em massa (ODBC) e Troca de campos de registro (RFX). Para obter um foco em dynasets e instantâneos, consulte os artigos Dynaset e Snapshot.
Hierarquia de herança
CRecordset
Requisitos
Cabeçalho: afxdb.h
CRecordset::AddNew
Prepara-se para adicionar um novo registro à tabela.
virtual void AddNew();
Comentários
Você deve chamar a função membro Requery
para ver o registro recém-adicionado. Os campos do registro são inicialmente Null. (Na terminologia do banco de dados, Null significa "sem valor" e não é o mesmo que NULL em C++.) Para concluir a operação, você deve chamar a função de membro Update
. Update
salva as alterações feitas na fonte de dados.
Observação
Se você implementou a busca de linhas em massa, não poderá chamar AddNew
. Isso resultará em uma declaração com falha. Embora a classe CRecordset
não forneça um mecanismo para atualizar linhas de dados em massa, você pode escrever suas próprias funções usando a função API ODBC SQLSetPos
. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
AddNew
prepara um novo registro vazio usando os membros de dados de campo do conjunto de registros. Depois de chamar AddNew
, defina os valores desejados nos membros de dados de campo do conjunto de registros. (Você não precisa chamar a função de membro Edit para essa finalidade; use Edit
apenas para registros existentes.) Quando você chama Update
, os valores alterados nos membros de dados do campo são salvos na fonte de dados.
Cuidado
Se você rolar para um novo registro antes de chamar Update
, o novo registro será perdido e nenhum aviso será dado.
Se o banco de dados der suporte a transações, você poderá tornar a chamada AddNew
parte de uma transação. Para obter mais informações sobre transações, confira a classe CDatabase
. Chame CDatabase::BeginTrans
antes de chamar AddNew
.
Observação
Para dynasets, novos registros são adicionados ao conjunto de registros como o último registro. Os registros adicionados não são adicionados aos instantâneos; você deve chamar Requery
para atualizar o conjunto de registros.
É ilegal chamar AddNew
para um conjunto de registros cuja função de membro Open
não foi chamada. Um CDBException
será gerado se você chamar AddNew
para um conjunto de registros que não pode ser acrescentado. Você pode determinar se o conjunto de registros pode ser atualizado chamando CanAppend
.
Para obter mais informações, consulte os seguintes artigos: Recordset: Como conjuntos de registros atualizam registos (ODBC), Conjunto de registros: Adicionar, atualizar e excluir registros (ODBC) e Transação (ODBC).
Exemplo
confira Transação: realizando uma transação em um conjunto de registros (ODBC).
CRecordset::CanAppend
Determina se o conjunto de registros aberto anteriormente permite que você adicione novos registros.
BOOL CanAppend() const;
Valor retornado
Diferente de zero se o conjunto de registros permitir a adição de novos registros; caso contrário, 0. CanAppend
retornará 0 se você tiver aberto o conjunto de registros como somente leitura.
CRecordset::CanBookmark
Determina se o conjunto de registros permite que você marque registros usando indicadores.
BOOL CanBookmark() const;
Valor retornado
Diferente de zero se o conjunto de registros der suporte a indicadores; caso contrário, será zero.
Comentários
Essa função é independente da opção CRecordset::useBookmarks
no parâmetro dwOptions
da função de membro Open
. CanBookmark
indica se o driver ODBC fornecido e o tipo de cursor dão suporte a indicadores. CRecordset::useBookmarks
indica se os indicadores estarão disponíveis, desde que sejam compatíveis.
Observação
Não há suporte para indicadores em conjuntos de registros que sejam somente encaminhamento.
Para obter mais informações sobre indicadores e navegação de conjunto de registros, consulte os artigos Conjunto de registros: indicadores e posições absolutas (ODBC) e Conjunto de registros: deslocamento (ODBC).
CRecordset::Cancel
Solicita que a fonte de dados cancele uma operação assíncrona em andamento ou um processo de um segundo thread.
void Cancel();
Comentários
As classes ODBC do MFC não usam mais processamento assíncrono; para executar uma operação assíncrona, você deve chamar diretamente a função SQLSetConnectOption
da API ODBC. Para obter mais informações, confira "Executando funções de forma assíncrona" no Guia do programador do SDK do ODBC.
CRecordset::CancelUpdate
Cancela todas as atualizações pendentes, causadas por uma operação Edit
ou AddNew
, antes Update
de ser chamada.
void CancelUpdate();
Comentários
Observação
Essa função de membro não é aplicável em conjuntos de registros que estão usando busca em massa de linhas, pois esses conjuntos de registros não podem chamar Edit
, AddNew
ou Update
. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Se a verificação automática de campo sujo estiver habilitada, CancelUpdate
restaurará as variáveis de membro para os valores que tinham antes Edit
ou AddNew
foram chamados; caso contrário, as alterações de valor permanecerão. Por padrão, a verificação automática de campo é habilitada quando o conjunto de registros é aberto. Para desabilitá-lo, você deve especificar o CRecordset::noDirtyFieldCheck
no parâmetrodwOptions
da função de membro Open.
Para obter mais informações sobre como atualizar dados, consulte Conjunto de registros: adicionar, atualizar e excluir registros (ODBC).
CRecordset::CanRestart
Determina se o conjunto de registros permite reiniciar sua consulta (para atualizar seus registros) chamando a função de membro Requery
.
BOOL CanRestart() const;
Valor retornado
Diferente de zero se a nova consulta for permitida; caso contrário, 0.
CRecordset::CanScroll
Determina se o conjunto de registros permite o deslocamento.
BOOL CanScroll() const;
Valor retornado
Diferente de zero se o conjunto de registros permitir o deslocamento; caso contrário, 0.
Comentários
Para obter mais informações sobre deslocamento, confira Conjunto de registros: deslocamento (ODBC).
CRecordset::CanTransact
Determina se o conjunto de registros permite transações.
BOOL CanTransact() const;
Valor retornado
Diferente de zero se o conjunto de registros permitir transações; caso contrário, 0.
Comentários
Para obter mais informações, confira Transação (ODBC).
CRecordset::CanUpdate
Determina se o conjunto de registros pode ser atualizado.
BOOL CanUpdate() const;
Valor retornado
Diferente de zero se o conjunto de registros puder ser atualizado; caso contrário, 0.
Comentários
Um conjunto de registros poderá ser somente leitura se a fonte de dados subjacente for somente leitura ou se você especificou CRecordset::readOnly
no parâmetro dwOptions
quando abriu o conjunto de registros.
CRecordset::CheckRowsetError
Chamado para lidar com erros gerados durante a busca de registros.
virtual void CheckRowsetError(RETCODE nRetCode);
Parâmetros
nRetCode
Um código de retorno da função de API ODBC. Para obter detalhes, consulte Observações.
Comentários
Essa função de membro virtual lida com erros que ocorrem quando os registros são buscados e é útil durante a busca de linhas em massa. Talvez você queira considerar a substituição de CheckRowsetError
para implementar seu próprio tratamento de erros.
CheckRowsetError
é chamado automaticamente em uma operação de navegação de cursor, como Open
, Requery
ou qualquer operação Move
. Ele é passado o valor retornado da função de API ODBC SQLExtendedFetch
. A tabela a seguir lista os possíveis valores do parâmetro nRetCode
.
nRetCode | Descrição |
---|---|
SQL_SUCCESS |
Função concluída com êxito; nenhuma informação adicional está disponível. |
SQL_SUCCESS_WITH_INFO |
Função concluída com êxito, possivelmente com um erro não fatal. Informações adicionais podem ser obtidas chamando SQLError . |
SQL_NO_DATA_FOUND |
Todas as linhas do conjunto de resultados foram buscadas. |
SQL_ERROR |
Falha na função. Informações adicionais podem ser obtidas chamando SQLError . |
SQL_INVALID_HANDLE |
Falha na função devido a um identificador de ambiente, identificador de conexão ou identificador de instrução inválido. Isso indica um erro de programação. Não há nenhuma informação adicional disponível de SQLError . |
SQL_STILL_EXECUTING |
Uma função que foi iniciada de forma assíncrona ainda está em execução. Por padrão, o MFC nunca passará esse valor para CheckRowsetError ; o MFC continuará chamando SQLExtendedFetch até que ele não retorne mais SQL_STILL_EXECUTING . |
Para obter mais informações sobre SQLError
, consulte o SDK do Windows. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
CRecordset::Close
Fecha o conjunto de registros.
virtual void Close();
Comentários
O ODBC HSTMT
e toda a memória que a estrutura alocada para o conjunto de registros são desalocados. Normalmente, após a chamar Close
, você exclui o objeto do conjunto de registros C++ se ele foi alocado com new
.
Você pode chamar Open
novamente depois de chamar Close
. Isso permite reutilizar o objeto do conjunto de registros. A alternativa é chamar Requery
.
Exemplo
// Construct a snapshot object
CCustomer rsCustSet(NULL);
if (!rsCustSet.Open())
return;
// Use the snapshot ...
// Close the snapshot
rsCustSet.Close();
// Destructor is called when the function exits
CRecordset::CRecordset
Constrói um objeto CRecordset
.
CRecordset(CDatabase* pDatabase = NULL);
Parâmetros
pDatabase
Contém um ponteiro para um objeto CDatabase
ou o valor NULL
. Se não for NULL
e a função de membro Open
do objeto CDatabase
não tiver sido chamada para conectá-la à fonte de dados, o conjunto de registros tentará abri-la para você durante sua própria chamada Open
. Se você passar NULL
, um objeto CDatabase
será construído e conectado para você usando as informações de fonte de dados especificadas se você deu origem à classe de conjunto de registros com ClassWizard.
Comentários
Você pode usar CRecordset
diretamente ou derivar uma classe específica do aplicativo de CRecordset
. Você pode usar ClassWizard para derivar suas classes de conjunto de registros.
Observação
Uma classe derivada deve fornecer seu próprio construtor. No construtor de sua classe derivada, chame o construtor CRecordset::CRecordset
, passando os parâmetros apropriados para ele.
Passe NULL
para o construtor do conjunto de registros para que um objeto CDatabase
seja construído e conectado automaticamente. Esse é uma abreviação útil que não exige que você construa e conecte um objeto CDatabase
antes de construir seu conjunto de registros.
Exemplo
Para obter mais informações, confira Conjunto de registros: declarando uma classe para uma tabela (ODBC).
CRecordset::Delete
Exclui o registro atual.
virtual void Delete();
Comentários
Após uma exclusão bem-sucedida, os membros de dados de campo do conjunto de registros são definidos como um valor Null e você deve chamar explicitamente uma das funções Move
para sair do registro excluído. Depois de sair do registro excluído, não é possível retornar a ele. Se o banco de dados der suporte a transações, você poderá tornar sua chamada Delete
parte de uma transação. Para obter mais informações, confira Transação (ODBC).
Observação
Se você implementou a busca de linhas em massa, não poderá chamar Delete
. Isso resultará em uma declaração com falha. Embora a classe CRecordset
não forneça um mecanismo para atualizar linhas de dados em massa, você pode escrever suas próprias funções usando a função API ODBC SQLSetPos
. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Cuidado
O conjunto de registros deve ser atualizável e deve haver um registro válido atual no conjunto de registros quando você chamar Delete
; caso contrário, ocorrerá um erro. Por exemplo, se você excluir um registro, mas não se deslocar para um novo registro antes de chamar Delete
novamente, Delete
gera CDBException.
Diferentemente de AddNew
e Edit
, uma chamada para Delete
não é seguida por uma chamada para Update
. Se uma chamada Delete
falhar, os membros dos dados do campo ficarão inalterados.
Exemplo
Este exemplo mostra um conjunto de registros criado no quadro de uma função. O exemplo pressupõe a existência de m_dbCust
, uma variável de membro do tipo CDatabase
já conectada à fonte de dados.
// Create a derived CRecordset object
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if (rsCustSet.IsEOF() || !rsCustSet.CanUpdate() ||
!rsCustSet.CanTransact())
{
return;
}
m_dbCust.BeginTrans();
// Perhaps scroll to a new record...
// Delete the current record
rsCustSet.Delete();
// Finished commands for this transaction
if (IDYES == AfxMessageBox(_T("Commit transaction?"), MB_YESNO))
m_dbCust.CommitTrans();
else // User changed mind
m_dbCust.Rollback();
CRecordset::DoBulkFieldExchange
Chamado para trocar linhas em massa de dados da fonte de dados para o conjunto de registros. Implementa a troca de campo de registro em massa (RFX em massa).
virtual void DoBulkFieldExchange(CFieldExchange* pFX);
Parâmetros
pFX
Um ponteiro para um objeto CFieldExchange
. A estrutura já terá configurado esse objeto para especificar um contexto para a operação de troca de campo.
Comentários
Quando a busca em massa de linhas é implementada, a estrutura chama essa função membro para transferir automaticamente dados da fonte de dados para o objeto do conjunto de registros. DoBulkFieldExchange
também associa seus membros de dados de parâmetro, se houver, a espaços reservados de parâmetro na cadeia de caracteres de instrução SQL para a seleção do conjunto de registros.
Se a busca em linha em massa não for implementada, a estrutura chamará DoFieldExchange
. Para implementar a busca de linhas em massa, você deve especificar a opção CRecordset::useMultiRowFetch
do parâmetro dwOptions na função de membro Open
.
Observação
DoBulkFieldExchange
estará disponível somente se você estiver usando uma classe derivada de CRecordset
. Se você tiver criado um objeto de conjunto de registros diretamente de CRecordset
, deverá chamar a função de membro GetFieldValue
para recuperar dados.
A troca de campo de registro em massa (RFX em massa) é semelhante à troca de campo de registro (RFX). Os dados são transferidos automaticamente da fonte de dados para o objeto do conjunto de registros. No entanto, você não pode chamarAddNew
, Edit
, Delete
ou Update
para transferir alterações de volta para a fonte de dados. Atualmente, a classe CRecordset
não fornece um mecanismo para atualizar linhas de dados em massa, porém, você pode escrever suas próprias funções usando a função API ODBC SQLSetPos
.
O ClassWizard não dá suporte à troca de campo de registro em massa; portanto, você deve substituir DoBulkFieldExchange
manualmente escrevendo chamadas para as funções RFX em massa. Para saber mais sobre essas funções, confira Funções de troca de campo de registro.
Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC). Para consultar informações relacionadas, confira Troca de campo de registro (RFX).
CRecordset::DoFieldExchange
Chamado para trocar dados (em ambas as direções) entre os membros de dados de campo do conjunto de registros e o registro correspondente na fonte de dados. Implementa a troca de campo de registro (RFX).
virtual void DoFieldExchange(CFieldExchange* pFX);
Parâmetros
pFX
Um ponteiro para um objeto CFieldExchange
. A estrutura já terá configurado esse objeto para especificar um contexto para a operação de troca de campo.
Comentários
Quando a busca de linhas em massa não é implementada, a estrutura chama essa função de membro para trocar dados automaticamente entre os membros de dados de campo do objeto do conjunto de registros e as colunas correspondentes do registro atual na fonte de dados. DoFieldExchange
também associa seus membros de dados de parâmetro, se houver, a espaços reservados de parâmetro na cadeia de caracteres de instrução SQL para a seleção do conjunto de registros.
Se a busca de linhas em massa não for implementada, a estrutura chamará DoBulkFieldExchange
. Para implementar a busca de linhas em massa, você deve especificar a opção CRecordset::useMultiRowFetch
do parâmetro dwOptions
na função de membro Open
.
Observação
DoFieldExchange
estará disponível somente se você estiver usando uma classe derivada de CRecordset
. Se você tiver criado um objeto de conjunto de registros diretamente de CRecordset
, deverá chamar a função de membro GetFieldValue para recuperar dados.
A troca de dados de campo, chamada de troca de campo de registro (RFX), funciona em ambas as direções: dos membros de dados de campo do objeto do conjunto de registros aos campos do registro na fonte de dados e do registro na fonte de dados para o objeto do conjunto de registros.
A única ação que você normalmente deve tomar para implementar DoFieldExchange
para sua classe de conjunto de registros derivada é criar a classe com ClassWizard e especificar os nomes e tipos de dados dos membros de dados do campo. Você também pode adicionar código ao que o ClassWizard grava para especificar membros de dados de parâmetro ou para lidar com todas as colunas associadas dinamicamente. Para obter mais informações, confira Conjunto de registros: associando dinamicamente colunas de dados (ODBC).
Quando você declara sua classe de conjunto de registros derivada com ClassWizard, o assistente grava uma substituição de DoFieldExchange
para você, que se assemelha ao exemplo a seguir:
void CCustomer::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
// Macros such as RFX_Text() and RFX_Int() are dependent on the
// type of the member variable, not the type of the field in the database.
// ODBC will try to automatically convert the column value to the requested type
RFX_Long(pFX, _T("[CustomerID]"), m_CustomerID);
RFX_Text(pFX, _T("[ContactFirstName]"), m_ContactFirstName);
RFX_Text(pFX, _T("[PostalCode]"), m_PostalCode);
RFX_Text(pFX, _T("[L_Name]"), m_L_Name);
RFX_Long(pFX, _T("[BillingID]"), m_BillingID);
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param"), m_strParam);
}
Para saber mais sobre as funções RFX, confira Funções de troca de campo de registro.
Para obter mais exemplos e detalhes sobre DoFieldExchange
, confira Troca de campo de registro: como a RFX funciona. Para obter informações sobre RFX, confira Troca de campo de registro.
CRecordset::Edit
Permite alterações no registro atual.
virtual void Edit();
Comentários
Depois de chamar Edit
, você pode alterar os membros de dados do campo redefinindo diretamente seus valores. A operação é concluída quando você chama a função de membro Update
para salvar suas alterações na fonte de dados.
Observação
Se você implementou a busca de linhas em massa, não poderá chamar Edit
. Isso resultará em uma declaração com falha. Embora a classe CRecordset
não forneça um mecanismo para atualizar linhas de dados em massa, você pode escrever suas próprias funções usando a função API ODBC SQLSetPos
. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Edit
salva os valores dos membros de dados do conjunto de registros. Se você chamar Edit
, fizer alterações e chamar Edit
novamente, os valores do registro serão restaurados para o que eram antes da primeira chamada Edit
.
Em alguns casos, é recomendável atualizar uma coluna tornando-a Null (sem dados). Para fazer isso, chame SetFieldNull
com um parâmetro TRUE para marcar o campo Null; isso também faz com que a coluna seja atualizada. Se você quiser que um campo seja gravado na fonte de dados mesmo que seu valor não tenha sido alterado, chame SetFieldDirty
com um parâmetro TRUE. Isso funciona mesmo se o campo tivesse o valor Null.
Se o banco de dados der suporte a transações, você poderá tornar sua chamada Edit
parte de uma transação. Chame CDatabase::BeginTrans
antes de chamar Edit
e depois que o conjunto de registros for aberto. Além disso, chamar CDatabase::CommitTrans
não substitui a chamada de Update
para concluir a operação Edit
. Para obter mais informações sobre transações, confira a classe CDatabase
.
Dependendo do modo de bloqueio atual, o registro que está sendo atualizado pode ser bloqueado por Edit
até que você chame Update
ou se desloque para outro registro ou ele só poderá ser bloqueado durante a chamada de Edit
. você pode alterar o modo de bloqueio com SetLockingMode
.
O valor anterior do registro atual será restaurado se você rolar para um novo registro antes de chamar Update
. Um CDBException
será gerado se você chamar Edit
para um conjunto de registros que não pode ser atualizado ou se não houver nenhum registro atual.
Para obter mais informações, confira os artigos Transação (ODBC) e Conjunto de registros: registros de bloqueio (ODBC).
Exemplo
// To edit a record, first set up the edit buffer
rsCustSet.Edit();
// Then edit field data members for the record
rsCustSet.m_BillingID = 2795;
rsCustSet.m_ContactFirstName = _T("Jones Mfg");
// Finally, complete the operation
if (!rsCustSet.Update())
{
// Handle the failure to update
AfxMessageBox(_T("Couldn't update record!"));
}
CRecordset::FlushResultSet
Recupera o próximo conjunto de resultados de uma consulta predefinida (procedimento armazenado), se houver vários conjuntos de resultados.
BOOL FlushResultSet();
Valor retornado
Diferente de zero se houver mais conjuntos de resultados a serem recuperados; caso contrário, 0.
Comentários
Você deve chamar FlushResultSet
somente quando terminar de usar o cursor no conjunto de resultados atual. Quando você recupera o próximo conjunto de resultados chamando FlushResultSet
, seu cursor não é válido nesse conjunto de resultados; você deve chamar a função de membro MoveNext
depois de chamar FlushResultSet
.
Se uma consulta predefinida usa um parâmetro de saída ou parâmetros de entrada/saída, você deve chamar FlushResultSet
até que ela retorne FALSE
(o valor 0) para obter esses valores de parâmetro.
FlushResultSet
chama a função de API ODBC SQLMoreResults
. Se SQLMoreResults
retornar SQL_ERROR
ou SQL_INVALID_HANDLE
, então FlushResultSet
gerará uma exceção. Para obter mais informações sobre SQLMoreResults
, consulte o SDK do Windows.
O procedimento armazenado precisa ter campos associados se você quiser chamar FlushResultSet
.
Exemplo
O código a seguir pressupõe que COutParamRecordset
seja um objeto derivado de CRecordset
com base em uma consulta predefinida com um parâmetro de entrada e um parâmetro de saída e com vários conjuntos de resultados. Observe a estrutura da substituição de DoFieldExchange
.
// DoFieldExchange override
//
// Only necessary to handle parameter bindings.
// Don't use CRecordset-derived class with bound
// fields unless all result sets have same schema
// OR there is conditional binding code.
void CCourses::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputParam);
RFX_Long(pFX, _T("Param1"), m_nCountParam);
// The "Param1" name here is a dummy name
// that is never used
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param2"), m_strNameParam);
// The "Param2" name here is a dummy name
// that is never used
}
// Assume db is an already open CDatabase object
CCourses rs(&m_dbCust);
rs.m_strNameParam = _T("History");
// Get the first result set
// NOTE: SQL Server requires forwardOnly cursor
// type for multiple rowset returning stored
// procedures
rs.Open(CRecordset::forwardOnly,
_T("{? = CALL GetCourses( ? )}"),
CRecordset::readOnly);
// Loop through all the data in the first result set
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
// Retrieve other result sets...
while (rs.FlushResultSet())
{
// must call MoveNext because cursor is invalid
rs.MoveNext();
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
}
// All result sets have been flushed. Cannot
// use the cursor, but the output parameter,
// m_nCountParam, has now been written.
// Note that m_nCountParam is not valid until
// CRecordset::FlushResultSet has returned FALSE,
// indicating no more result sets will be returned.
// TO DO: Use m_nCountParam
// Cleanup
rs.Close();
CRecordset::GetBookmark
Obtém o valor do indicador para o registro atual.
void GetBookmark(CDBVariant& varBookmark);
Parâmetros
varBookmark
Uma referência a um objeto CDBVariant
que representa o indicador no registro atual.
Comentários
Para determinar se há suporte para indicadores no conjunto de registros, chame CanBookmark
. Para disponibilizar indicadores se eles tiverem suporte, você deve definir a opção CRecordset::useBookmarks
no parâmetro dwOptions
da função de membro Open
.
Observação
Se os indicadores não tiverem suporte ou não estiverem disponíveis, chamar GetBookmark
resultará na geração de uma exceção. Não há suporte para indicadores em conjuntos de registros que sejam somente encaminhamento.
GetBookmark
atribui o valor do indicador para o registro atual a um objeto CDBVariant
. Para retornar a esse registro a qualquer momento depois de mover para um registro diferente, chame SetBookmark
com o objeto correspondente CDBVariant
.
Observação
Após determinadas operações de conjunto de registros, os indicadores podem não ser mais válidos. Por exemplo, se você chamar GetBookmark
seguido de Requery
, talvez não seja possível retornar ao registro com SetBookmark
. Chame CDatabase::GetBookmarkPersistence
para verificar se você pode chamar SetBookmark
com segurança.
Para obter mais informações sobre indicadores e navegação de conjunto de registros, consulte os artigos Conjunto de registros: indicadores e posições absolutas (ODBC) e Conjunto de registros: deslocamento (ODBC).
CRecordset::GetDefaultConnect
Chamado para obter a cadeia de conexão padrão.
virtual CString GetDefaultConnect();
Valor retornado
Um CString
que contém a cadeia de conexão padrão.
Comentários
A estrutura chama essa função de membro para obter a cadeia de conexão padrão da fonte de dados na qual o conjunto de registros se baseia. ClassWizard
implementa essa função para você identificando a mesma fonte de dados usada em ClassWizard
para obter informações sobre tabelas e colunas. Você provavelmente achará conveniente confiar nessa conexão padrão ao desenvolver seu aplicativo. Mas a conexão padrão pode não ser apropriada para os usuários do aplicativo. Se esse for o caso, você deverá reimplementar essa função, descartando a versão do ClassWizard
. Para obter mais informações sobre cadeias de conexão, consulte Fonte de dados (ODBC).
CRecordset::GetDefaultSQL
Chamado para obter a cadeia de caracteres SQL padrão a ser executada.
virtual CString GetDefaultSQL();
Valor retornado
Um CString
que contém a instrução SQL padrão.
Comentários
A estrutura chama essa função membro para obter a instrução SQL padrão na qual o conjunto de registros se baseia. Pode ser um nome de tabela ou uma instrução SQL SELECT
.
Você define indiretamente a instrução SQL padrão declarando sua classe de conjunto de registros com ClassWizard
, e ClassWizard
executa essa tarefa para você.
Se você precisar da cadeia de caracteres de instrução SQL para seu próprio uso, chame GetSQL
, que retorna a instrução SQL usada para selecionar os registros do conjunto de registros quando ele foi aberto. Você pode editar a cadeia de caracteres SQL padrão na substituição de GetDefaultSQL
da sua classe. Por exemplo, você pode especificar uma chamada para uma consulta predefinida usando uma instrução CALL
. (Observe, no entanto, que, se você editar GetDefaultSQL
, também precisará modificar m_nFields
para corresponder ao número de colunas na fonte de dados.)
Para obter mais informações, confira Conjunto de registros: declarando uma classe para uma tabela (ODBC).
Cuidado
O nome da tabela estará vazio se a estrutura não puder identificar um nome de tabela, se vários nomes de tabela tiverem sido fornecidos ou se não tiver sido possível interpretar uma instrução CALL
. Ao usar uma instrução CALL
, não insira espaço em branco entre a chave e a palavra-chave CALL
, nem antes da chave ou antes da palavra-chave SELECT
em uma instrução SELECT
.
CRecordset::GetFieldValue
Recupera dados de campo no registro atual.
void GetFieldValue(
LPCTSTR lpszName,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
LPCTSTR lpszName,
CStringA& strValue
);
void GetFieldValue(
LPCTSTR lpszName,
CStringW& strValue
);
void GetFieldValue(
short nIndex,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
short nIndex,
CStringA& strValue);
void GetFieldValue(
short nIndex,
CStringW& strValue);
Parâmetros
lpszName
O nome de um campo.
varValue
Uma referência a um objeto CDBVariant
que armazenará o valor do campo.
nFieldType
O tipo de dados ODBC C do campo. Usando o valor padrão, DEFAULT_FIELD_TYPE
, força GetFieldValue
a determinar o tipo de dados C do tipo de dados SQL, com base na tabela a seguir. Caso contrário, você pode especificar o tipo de dados diretamente ou escolher um tipo de dados compatível; por exemplo, você pode armazenar qualquer tipo de dados em SQL_C_CHAR
.
Tipos de dados do C | Tipo de dados SQL |
---|---|
SQL_C_BIT |
SQL_BIT |
SQL_C_UTINYINT |
SQL_TINYINT |
SQL_C_SSHORT |
SQL_SMALLINT |
SQL_C_SLONG |
SQL_INTEGER |
SQL_C_FLOAT |
SQL_REAL |
SQL_C_DOUBLE |
SQL_FLOATSQL_DOUBLE |
SQL_C_TIMESTAMP |
SQL_DATESQL_TIMESQL_TIMESTAMP |
SQL_C_CHAR |
SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR |
SQL_C_BINARY |
SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY |
Para obter mais informações sobre tipos de dados ODBC, consulte os tópicos "Tipos de Dados SQL" e "Tipos de Dados C" no Apêndice D do SDK do Windows.
nIndex
O índice de base zero do campo.
strValue
Uma referência a um objeto CString
que armazenará o valor do campo convertido em texto, independentemente do tipo de dados do campo.
Comentários
Você pode pesquisar um campo por nome ou por índice. Você pode armazenar o valor do campo em um objeto CDBVariant
ou objeto CString
.
Se você tiver implementado a busca de linhas em massa, o registro atual sempre será posicionado no primeiro registro em um conjunto de linhas. Para usar GetFieldValue
em um registro dentro de um determinado conjunto de linhas, primeiro você deve chamar a função de membro SetRowsetCursorPosition
para mover o cursor para a linha desejada dentro desse conjunto de linhas. Em seguida, chame GetFieldValue
para essa linha. Para implementar a busca de linhas em massa, você deve especificar a opção CRecordset::useMultiRowFetch
do parâmetro dwOptions
na função de membro Open
.
Você pode usar GetFieldValue
para buscar dinamicamente campos em tempo de execução em vez de vinculá-los estaticamente no momento do projeto. Por exemplo, se você tiver declarado um objeto de conjunto de registros diretamente de CRecordset
, deverá usar GetFieldValue
para recuperar os dados de campo; a RFX (troca de campo de registro) ou a troca de campo de registro em massa (RFX em massa) não será implementada.
Observação
Se você declarar um objeto de conjunto de registros sem derivar de CRecordset
, não carregue a biblioteca de cursores ODBC. A biblioteca de cursores exige que o conjunto de registros tenha pelo menos uma coluna associada; no entanto, quando você usa CRecordset
diretamente, nenhuma das colunas é associada. As funções de membro CDatabase::OpenEx
e CDatabase::Open
controlam se a biblioteca de cursores será carregada.
GetFieldValue
chama a função de API ODBC SQLGetData
. Se o driver gerar o valor SQL_NO_TOTAL para o comprimento real do valor do campo, GetFieldValue
gerará uma exceção. Para obter mais informações sobre SQLGetData
, consulte o SDK do Windows.
Exemplo
O código de exemplo a seguir ilustra chamadas de GetFieldValue
para um objeto de conjunto de registros declarado diretamente de CRecordset
.
// Create and open a database object;
// do not load the cursor library
CDatabase db;
db.OpenEx(NULL, CDatabase::forceOdbcDialog);
// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));
// Create a CDBVariant object to
// store field data
CDBVariant varValue;
// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount();
while (!rs.IsEOF())
{
for (short index = 0; index < nFields; index++)
{
rs.GetFieldValue(index, varValue);
// do something with varValue
}
rs.MoveNext();
}
rs.Close();
db.Close();
Observação
Ao contrário da classe DAO CDaoRecordset
, CRecordset
não tem uma função de membro SetFieldValue
. Se você criar um objeto diretamente de CRecordset
, ele será somente leitura.
Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
CRecordset::GetODBCFieldCount
Recupera o número total de campos no objeto do conjunto de registros.
short GetODBCFieldCount() const;
Valor retornado
O número de campos no conjunto de registros.
Comentários
Para obter mais informações sobre como criar conjuntos de registros, consulte Conjunto de registros: criando e fechando conjunto de registros (ODBC).
CRecordset::GetODBCFieldInfo
Obtém informações sobre os campos no conjunto de registros.
void GetODBCFieldInfo(
LPCTSTR lpszName,
CODBCFieldInfo& fieldinfo);
void GetODBCFieldInfo(
short nIndex,
CODBCFieldInfo& fieldinfo);
Parâmetros
lpszName
O nome de um campo.
fieldinfo
Uma referência a uma estrutura CODBCFieldInfo
.
nIndex
O índice de base zero do campo.
Comentários
Uma versão da função permite pesquisar um campo por nome. A outra versão permite pesquisar um campo pelo índice.
Para obter uma descrição sobre as informações retornadas, consulte a estrutura CODBCFieldInfo
.
Para obter mais informações sobre como criar conjuntos de registros, consulte Conjunto de registros: criando e fechando conjunto de registros (ODBC).
CRecordset::GetRecordCount
Determina o tamanho do conjunto de registros.
long GetRecordCount() const;
Valor retornado
O número de registros no conjunto de registros; 0 se o conjunto de registros não contiver registros; ou -1 se não for possível determinar a contagem de registros.
Comentários
Cuidado
A contagem de registros é mantida como uma "marca d'água alta", o registro com maior número ainda é visto à medida que o usuário percorre os registros. O número total de registros só é conhecido depois que o usuário ultrapassa o último registro. Por motivos de desempenho, a contagem não é atualizada quando você chama MoveLast
. Para contar os registros por conta própria, chame MoveNext
repetidamente até IsEOF
retornar diferente de zero. Adicionar um registro por meio de CRecordset:AddNew
e Update
aumenta a contagem; excluir um registro por meio de CRecordset::Delete
diminui a contagem.
CRecordset::GetRowsetSize
Obtém a configuração atual para o número de linhas que você deseja recuperar durante uma determinada busca.
DWORD GetRowsetSize() const;
Valor retornado
O número de linhas a serem recuperadas durante uma determinada busca.
Comentários
Se você estiver usando a busca em massa de linhas, o tamanho padrão do conjunto de linhas quando o conjunto de registros for aberto será 25; caso contrário, será 1.
Para implementar a busca de linhas em massa, você deve especificar a opção CRecordset::useMultiRowFetch
no parâmetro dwOptions
da função de membro Open
. Para alterar a configuração do tamanho do conjunto de linhas, chame SetRowsetSize
.
Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
CRecordset::GetRowsFetched
Determina quantos registros foram recuperados após uma busca.
DWORD GetRowsFetched() const;
Valor retornado
O número de linhas recuperadas da fonte de dados após uma determinada busca.
Comentários
Isso é útil quando você implementa a busca de linhas em massa. O tamanho do conjunto de linhas normalmente indica quantas linhas serão recuperadas de uma busca. No entanto, o número total de linhas no conjunto de registros também afeta quantas linhas serão recuperadas em um conjunto de linhas. Por exemplo, se o conjunto de registros tiver 10 registros com uma configuração de tamanho de conjunto de linhas de quatro, o loop pelo conjunto de registros chamando MoveNext
resultará no conjunto de linhas final com apenas dois registros.
Para implementar a busca de linhas em massa, você deve especificar a opção CRecordset::useMultiRowFetch
no parâmetro dwOptions da função de membro Open
. Para especificar o tamanho do conjunto de linhas, chame SetRowsetSize.
Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Exemplo
CMultiCustomer rs(&m_dbCust);
// Set the rowset size
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// loop through the recordset by rowsets
while (!rs.IsEOF())
{
for (int rowCount = 0; rowCount < (int)rs.GetRowsFetched(); rowCount++)
{
// do something
}
rs.MoveNext();
}
rs.Close();
CRecordset::GetRowStatus
Obtém o status de uma linha no conjunto de linhas atual.
WORD GetRowStatus(WORD wRow) const;
Parâmetros
wRow
A posição baseada em um de uma linha no conjunto de linhas atual. Esse valor pode variar de 1 até o tamanho do conjunto de linhas.
Valor retornado
Um valor de status para a linha. Para obter detalhes, consulte Observações.
Comentários
GetRowStatus
retorna um valor que indica alguma alteração no status da linha desde a última recuperação da fonte de dados ou que nenhuma linha correspondente a wRow
foi buscada. A tabela a seguir lista os possíveis valores de retorno.
Valor de status | Descrição |
---|---|
SQL_ROW_SUCCESS |
A linha é inalterada. |
SQL_ROW_UPDATED |
A linha foi atualizada. |
SQL_ROW_DELETED |
A linha foi excluída. |
SQL_ROW_ADDED |
A linha foi adicionada. |
SQL_ROW_ERROR |
A linha não pode ser recuperada devido a um erro. |
SQL_ROW_NOROW |
Nenhuma linha corresponde a wRow . |
Para obter mais informações, confira a função de API ODBC SQLExtendedFetch
no SDK do Windows.
CRecordset::GetStatus
Determina o índice do registro atual no conjunto de registros e se o último registro foi visto.
void GetStatus(CRecordsetStatus& rStatus) const;
Parâmetros
rStatus
Uma referência a um objeto CRecordsetStatus
. Para obter mais informações, consulte Comentários.
Comentários
CRecordset
tenta controlar o índice, mas em algumas circunstâncias isso pode não ser possível. Consulte GetRecordCount
para obter uma explicação.
A estrutura CRecordsetStatus
tem a seguinte forma:
struct CRecordsetStatus
{
long m_lCurrentRecord;
BOOL m_bRecordCountFinal;
};
Os dois membros de CRecordsetStatus
tẽm os seguintes significados:
m_lCurrentRecord
Contém o índice baseado em zero do registro atual no conjunto de registros, se for conhecido. Se não for possível determinar o índice, esse membro conteráAFX_CURRENT_RECORD_UNDEFINED
(-2). SeIsBOF
for TRUE (conjunto de registros vazio ou tentar se deslocar antes do primeiro registro), entãom_lCurrentRecord
será definido comoAFX_CURRENT_RECORD_BOF
(-1). Se estiver no primeiro registro, ele será definido como 0, no segundo registro será 1 e assim por diante.m_bRecordCountFinal
Diferente de zero se o número total de registros no conjunto de registros tiver sido determinado. Geralmente, isso deve ser feito começando no início do conjunto de registros e chamandoMoveNext
até queIsEOF
retorne diferente de zero. Se esse membro for zero, a contagem de registros conforme retornado porGetRecordCount
, se não -1, é apenas uma contagem de "marca d'água alta" dos registros.
CRecordset::GetSQL
Chame essa função de membro para obter a instrução SQL que foi usada para selecionar os registros do conjunto de registros quando ele foi aberto.
const CString& GetSQL() const;
Valor retornado
Uma referência a const
para um CString
que contém a instrução SQL.
Comentários
Geralmente, essa será uma instrução SELECT
do SQL. A cadeia de caracteres retornada por GetSQL
é somente leitura.
Normalmente, a cadeia de caracteres retornada por GetSQL
é diferente de qualquer cadeia de caracteres que você possa ter passado para o conjunto de registros no parâmetro lpszSQL
para a função de membro Open
. Isso ocorre porque o conjunto de registros constrói um instrução SQL completa baseada no que você passou para Open
, no que você pode ter especificado com ClassWizard
e no que você pode ter especificado nos membros de dados m_strFilter
e m_strSort
. Para obter detalhes sobre como o conjunto de registros constrói essa instrução SQL, consulte Conjunto de registros: como conjuntos de registros selecionam registros (ODBC).
Observação
Chame essa função de membro somente depois de chamar Open
.
CRecordset::GetTableName
Obtém o nome da tabela SQL na qual a consulta do conjunto de registros se baseia.
const CString& GetTableName() const;
Valor retornado
Uma referência a const
para um CString
que contém o nome da tabela, se o conjunto de registros for baseado em uma tabela; caso contrário, uma cadeia de caracteres vazia.
Comentários
GetTableName
só será válido se o conjunto de registros for baseado em uma tabela, não uma junção de várias tabelas ou uma consulta predefinida (procedimento armazenado). O nome é somente leitura.
Observação
Chame essa função de membro somente depois de chamar Open
.
CRecordset::IsBOF
Retornará diferente de zero se o conjunto de registros tiver sido posicionado antes do primeiro registro. Não há registro atual.
BOOL IsBOF() const;
Valor retornado
Diferente de zero se o conjunto de registros não contiver registros ou se você tiver se deslocado para trás antes do primeiro registro; caso contrário, será 0.
Comentários
Chame essa função de membro antes de se deslocar de registro para registro para saber se foi até antes do primeiro registro do conjunto de registros. Você também pode usar IsBOF
com IsEOF
para determinar se o conjunto de registros contém registros ou se está vazio. Imediatamente após você chamar Open
, se o conjunto de registros não contiver registros, IsBOF
retornará diferente de zero. Quando você abre um conjunto de registros que tem pelo menos um registro, o primeiro registro é o registro atual e IsBOF
retorna 0.
Se o primeiro registro for o registro atual e você chamar MovePrev
, IsBOF
retornará diferente de zero. Se IsBOF
retornar diferente de zero e você chamar MovePrev
, ocorrerá um erro. Se IsBOF
retornar diferente de zero, o registro atual será indefinido e qualquer ação que exija um registro atual resultará em um erro.
Exemplo
Este exemplo usa IsBOF
e IsEOF
para detectar os limites de um conjunto de registros à medida que o código rola pelo conjunto de registros em ambas as direções.
// Open a recordset; first record is current
// Open a recordset; first record is current
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if(rsCustSet.IsBOF())
return;
// The recordset is empty
// Scroll to the end of the recordset, past
// the last record, so no record is current
while (!rsCustSet.IsEOF())
rsCustSet.MoveNext();
// Move to the last record
rsCustSet.MoveLast();
// Scroll to beginning of the recordset, before
// the first record, so no record is current
while(!rsCustSet.IsBOF())
rsCustSet.MovePrev();
// First record is current again
rsCustSet.MoveFirst();
CRecordset::IsDeleted
Determina se o registro atual foi excluído.
BOOL IsDeleted() const;
Valor retornado
Diferente de zero se o conjunto de registros estiver posicionado em um registro excluído; caso contrário, será 0.
Comentários
Se você se deslocar para um registro e IsDeleted
retornar TRUE
(diferente de zero), você deverá mover para outro registro antes de executar qualquer outra operação de conjunto de registros.
O resultado depende de IsDeleted
muitos fatores, como o tipo de conjunto de registros, se o conjunto de registros está atualizável, se você especificou a opção CRecordset::skipDeletedRecords
quando abriu o conjunto de registros, se os pacotes de driver excluíram registros e se há vários usuários.
Para obter mais informações sobre CRecordset::skipDeletedRecords
e empacotamento de drivers, consulte a função de membro Open.
Observação
Se você implementou a busca de linhas em massa, não deve chamar IsDeleted
. Em vez disso, chame a função de membro GetRowStatus. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
CRecordset::IsEOF
Retornará diferente de zero se o conjunto de registros tiver sido posicionado depois do último registro. Não há registro atual.
BOOL IsEOF() const;
Valor retornado
Diferente de zero se o conjunto de registros não contiver registros ou se você tiver se deslocado para além do último registro; caso contrário, será 0.
Comentários
Chame essa função de membro quando você se deslocar de registro para registro para saber se você foi antes do último registro do conjunto de registros. Você também pode usar IsEOF
para determinar se o conjunto de registros contém registros ou se está vazio. Imediatamente após você chamar Open
, se o conjunto de registros não contiver registros, IsEOF
retornará diferente de zero. Quando você abre um conjunto de registros que tem pelo menos um registro, o primeiro registro é o registro atual e IsEOF
retorna 0.
Se o último registro for o registro atual e você chamar MoveNext
, IsEOF
retornará diferente de zero. Se IsEOF
retornar diferente de zero e você chamar MoveNext
, ocorrerá um erro. Se IsEOF
retornar diferente de zero, o registro atual será indefinido e qualquer ação que exija um registro atual resultará em um erro.
Exemplo
Confira o exemplo de IsBOF
.
CRecordset::IsFieldDirty
Determina se o membro de dados de campo especificado foi alterado desde que Edit
ou AddNew
foi chamado.
BOOL IsFieldDirty(void* pv);
Parâmetros
pv
Um ponteiro para o membro de dados de campo cujo status você deseja verificar ou NULL
para determinar se algum dos campos está sujo.
Valor retornado
Diferente de zero se o membro de dados de campo especificado tiver sido alterado desde a chamada de AddNew
ou Edit
; caso contrário, 0.
Comentários
Os dados em todos os membros de dados de campo sujo serão transferidos para o registro na fonte de dados quando o registro atual for atualizado por uma chamada para a função membro Update
de CRecordset
(seguindo uma chamada para Edit
ou AddNew
).
Observação
Essa função de membro não é aplicável em conjuntos de registros que estão usando a busca em massa de linhas. Se você tiver implementado a busca em massa de linhas, IsFieldDirty
sempre retornará FALSE e resultará em uma declaração com falha. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
A chamada IsFieldDirty
redefinirá os efeitos das chamadas anteriores para SetFieldDirty, uma vez que o status sujo do campo é reavaliado. No caso de AddNew
, se o valor do campo atual for diferente do valor pseudo nulo, o status do campo será definido como sujo. No caso de Edit
, se o valor do campo for diferente do valor armazenado em cache, o status do campo será definido como sujo.
IsFieldDirty
é implementado por meio de DoFieldExchange
.
Para obter mais informações sobre o sinalizador sujo, consulte Conjunto de registros: como conjuntos de registros selecionam registros (ODBC).
CRecordset::IsFieldNull
Retornará diferente de zero se o campo especificado no registro atual for Null (sem valor).
BOOL IsFieldNull(void* pv);
Parâmetros
pv
Um ponteiro para o membro de dados de campo cujo status você deseja verificar ou NULL
para determinar se algum dos campos é Null.
Valor retornado
Diferente de zero se o membro de dados de campo especificado estiver sinalizado como Null; caso contrário, será 0.
Comentários
Chame essa função de membro para determinar se o membro de dados de campo especificado de um dynaset foi sinalizado como "sujo" (alterado). (Na terminologia do banco de dados, Null significa "sem valor" e não é o mesmo que NULL
em C++.) Se um membro de dados de campo for sinalizado como Null, ele será interpretado como uma coluna do registro atual para o qual não há valor.
Observação
Essa função de membro não é aplicável em conjuntos de registros que estão usando a busca em massa de linhas. Se você tiver implementado a busca de linhas em massa, IsFieldNull
sempre retornará FALSE
e resultará em uma declaração com falha. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
IsFieldNull
é implementado por meio de DoFieldExchange
.
CRecordset::IsFieldNullable
Retornará diferente de zero se o campo especificado no registro atual puder ser definido como nulo (sem valor).
BOOL IsFieldNullable(void* pv);
Parâmetros
pv
Um ponteiro para o membro de dados de campo cujo status você deseja verificar ou NULL
para determinar se algum dos campos pode ser definido par aum valor Null.
Comentários
Chame essa função de membro para determinar se o membro de dados de campo especificado é "anulável" (pode ser definido como um valor Null; O NULL
do C++ não é o mesmo que Null, o que, na terminologia do banco de dados, significa "sem valor").
Observação
Se você implementou a busca de linhas em massa, não poderá chamar IsFieldNullable
. Em vez disso, chame a função de membro GetODBCFieldInfo
para determinar se um campo pode ser definido como um valor Null. Você sempre pode chamar GetODBCFieldInfo
, independentemente de ter implementado a busca de linhas em massa. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Um campo que não pode ser Null deve ter um valor. Se você tentar definir esse campo como Null ao adicionar ou atualizar um registro, a fonte de dados rejeitará a adição ou atualização e Update
lançará uma exceção. A exceção ocorre quando você chama Update
, não quando você chama SetFieldNull
.
O uso de NULL
para o primeiro argumento da função aplicará a função somente aos campos outputColumn
, não campos a param
. Por exemplo, a chamada
SetFieldNull(NULL);
definirá apenas campos outputColumn
como NULL
; campos param
não serão afetados.
Para trabalhar em campos param
, você deve fornecer o endereço real do param
individual no qual deseja trabalhar, como:
SetFieldNull(&m_strParam);
Isso significa que você não pode definir todos os campos param
para NULL
, como você pode com campos outputColumn
.
IsFieldNullable
é implementado por meio de DoFieldExchange.
CRecordset::IsOpen
Determina se o conjunto de registros já está aberto.
BOOL IsOpen() const;
Valor retornado
Diferente de zero se a função do membro Open
ou Requery
do objeto do conjunto de registros tiver sido chamada anteriormente e o conjunto de registros não tiver sido fechado; caso contrário, será 0.
CRecordset::m_hstmt
Contém um identificador para a estrutura de dados da instrução ODBC, do tipo HSTMT
, associada ao conjunto de registros.
Comentários
Cada consulta a uma fonte de dados ODBC está associada a um HSTMT
.
Cuidado
Não use m_hstmt
antes de Open
ter sido chamado.
Normalmente, você não precisa acessar o HSTMT
diretamente, mas talvez seja necessário para execução direta de instruções SQL. A função de membro ExecuteSQL
da classe CDatabase
fornece um exemplo do uso de m_hstmt
.
CRecordset::m_nFields
Contém o número de membros de dados de campo na classe de conjunto de registros; ou seja, o número de colunas selecionadas pelo conjunto de registros da fonte de dados.
Comentários
O construtor da classe do conjunto de registros deve inicializar m_nFields
com o número correto. Se você ainda não implementou a busca em massa de linhas, ClassWizard
grava essa inicialização para você ao usá-la para declarar sua classe de conjunto de registros. Você também pode gravá-lo manualmente.
A estrutura usa esse número para gerenciar a interação entre os membros dos dados de campo e as colunas correspondentes do registro atual na fonte de dados.
Cuidado
Esse número deve corresponder ao número de "colunas de saída" registrado em DoFieldExchange
ou DoBulkFieldExchange
depois de uma chamada para SetFieldType
com o parâmetro CFieldExchange::outputColumn
.
Você pode associar colunas dinamicamente, conforme explicado no artigo "Recordset: Dynamically Binding Data Columns". Se você fizer isso, deverá aumentar a contagem em m_nFields
para refletir o número de chamadas de função RFX ou RFX em massa em sua função de membro DoFieldExchange
ou DoBulkFieldExchange
para as colunas associadas dinamicamente.
Para obter mais informações, consulte os artigos Conjunto de registros: Associação dinâmica de colunas de dados (ODBC) e Conjunto de registros: buscando registros em massa (ODBC).
Exemplo
confira Registrar troca de campos: usando RFX.
CRecordset::m_nParams
Contém o número de membros de dados de parâmetro na classe de conjunto de registros; ou seja, o número de parâmetros passados com a consulta do conjunto de registros.
Comentários
Se a classe do conjunto de registros tiver membros de dados de parâmetro, o construtor da classe deverá inicializar m_nParams
com o número correto. O valor padrão de m_nParams
é 0. Se você adicionar membros de dados de parâmetro, o que você deve fazer manualmente, também deve adicionar manualmente uma inicialização no construtor de classe para refletir o número de parâmetros (que devem ser pelo menos tão grandes quanto o número de espaços reservados '' em sua cadeia de caracteres m_strFilter
ou m_strSort
).
A estrutura usa esse número quando parametriza a consulta do conjunto de registros.
Cuidado
Esse número deve corresponder ao número de "params" registrado em DoFieldExchange
ou DoBulkFieldExchange
após uma chamada para SetFieldType
com o valor de parâmetro de CFieldExchange::inputParam
, CFieldExchange::param
, CFieldExchange::outputParam
ou CFieldExchange::inoutParam
.
Exemplo
Consulte os artigos Conjunto de registros: Parametrizando um conjunto de registros (ODBC) e Troca de campos de registro: usando RFX.
CRecordset::m_pDatabase
Contém um ponteiro para o objeto CDatabase
por meio do qual o conjunto de registros está conectado a uma fonte de dados.
Comentários
Essa variável é definida de duas maneiras. Normalmente, você passa um ponteiro para um objeto CDatabase
já conectado ao construir o objeto do conjunto de registros. Se você passar NULL
em vez disso, CRecordset
cria um objeto CDatabase
para você e o conecta. Em ambos os casos, CRecordset
armazena o ponteiro nessa variável.
Normalmente, você não precisará usar o ponteiro armazenado em m_pDatabase
diretamente. No entanto, se você escrever suas próprias extensões para CRecordset
, talvez seja necessário usar o ponteiro. Por exemplo, talvez você precise do ponteiro se lançar seus próprios CDBException
s. Ou talvez você precise dele se tiver que fazer algo usando o mesmo objeto CDatabase
, como executar transações, definir tempos limite ou chamar a função de membro ExecuteSQL
da classe CDatabase
para executar instruções SQL diretamente.
CRecordset::m_strFilter
Depois de construir o objeto do conjunto de registros, mas antes de chamar sua função de membro Open
, use esse membro de dados para armazenar um CString
que contém uma cláusula WHERE
SQL.
Comentários
O conjunto de registros usa essa cadeia de caracteres para restringir (ou filtrar) os registros selecionados durante a chamada de Open
ou Requery
. Isso é útil para selecionar um subconjunto de registros, como "todos os vendedores com sede na Califórnia" ("state = CA"). A sintaxe do SQL ODBC para uma cláusula WHERE
é
WHERE search-condition
Não inclua a palavra-chave WHERE
na cadeia de caracteres. A estrutura a fornece.
Você também pode parametrizar sua cadeia de caracteres de filtro colocando espaços reservados '' nele, declarando um membro de dados de parâmetro em sua classe para cada espaço reservado e passando parâmetros para o conjunto de registros em tempo de execução. Isso permite que você construa o filtro no tempo de execução. Para obter mais informações, confira Conjunto de registros: parametrizando um conjunto de registros (ODBC).
Para obter mais informações sobre cláusulas WHERE
SQL, consulte SQL. Para obter mais informações sobre como selecionar e filtrar registros, consulte Conjunto de registros: filtrando registros (ODBC).
Exemplo
CCustomer rsCustSet(&m_dbCust);
// Set the filter
rsCustSet.m_strFilter = _T("L_Name = 'Flanders'");
// Run the filtered query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::m_strSort
Depois de construir o objeto do conjunto de registros, mas antes de chamar sua função de membro Open
, use esse membro de dados para armazenar um CString
que contém uma cláusula ORDER BY
SQL.
Comentários
O conjunto de registros usa essa cadeia de caracteres para classificar os registros selecionados durante a chamada de Open
ou Requery
. Você pode usar esse recurso para classificar um conjunto de registros em uma ou mais colunas. A sintaxe do SQL ODBC para uma cláusula ORDER BY
fica
ORDER BY sort-specification [, sort-specification]...
onde uma especificação de classificação é um inteiro ou um nome de coluna. Você também pode especificar a ordem crescente ou decrescente (a ordem é crescente por padrão) acrescentando "ASC" ou "DESC" à lista de colunas na cadeia de caracteres de classificação. Os registros selecionados são classificados primeiro pela primeira coluna listada, depois pela segunda e assim por diante. Por exemplo, você pode solicitar um conjunto de registros "Clientes" pelo sobrenome e, em seguida, primeiro nome. O número de colunas que você pode listar depende da fonte de dados. Para obter mais informações, confira o SDK do Windows.
Não inclua a palavra-chave ORDER BY
na cadeia de caracteres. A estrutura a fornece.
Para obter mais informações sobre cláusulas SQL, consulte SQL. Para obter mais informações sobre como classificar registros, consulte Conjunto de registros: Classificando registros (ODBC).
Exemplo
CCustomer rsCustSet(&m_dbCust);
// Set the sort string
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
// Run the sorted query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::Move
Move o ponteiro do registro atual dentro do conjunto de registros, seja para frente ou para trás.
virtual void Move(
long nRows,
WORD wFetchType = SQL_FETCH_RELATIVE);
Parâmetros
nRows
O número de linhas a serem movidas para frente ou para trás. Os valores positivos avançam até o final do conjunto de registros. Valores negativos se movem para trás, em direção ao início.
wFetchType
Determina o conjunto de linhas que Move
buscará. Para obter detalhes, consulte Observações.
Comentários
Se você passar um valor de 0 para nRows
, Move
atualizará o registro atual; Move
encerrará qualquer modo AddNew
ou Edit
atual e restaurará o valor do registro atual antes de AddNew
ou Edit
ter sido chamado.
Observação
Quando você passa por um conjunto de registros, não pode ignorar registros excluídos. Consulte CRecordset::IsDeleted
para obter mais informações. Quando você abre um CRecordset
com o conjunto de opções skipDeletedRecords
, Move
confirma se o parâmetro nRows
é 0. Esse comportamento impede a atualização de linhas que são excluídas por outros aplicativos cliente usando os mesmos dados. Consulte o parâmetro dwOption
em Open
para obter uma descrição de skipDeletedRecords
.
Move
reposiciona o conjunto de registros por conjuntos de linhas. Com base nos valores para nRows
e wFetchType
, Move
busca o conjunto de linhas apropriado e, em seguida, faz o primeiro registro nesse conjunto de linhas o registro atual. Se você ainda não implementou a busca de linhas em massa, o tamanho do conjunto de linhas será sempre 1. Ao buscar um conjunto de linhas, Move
chama diretamente a função de membro CheckRowsetError
para lidar com os erros resultantes da busca.
Dependendo dos valores que você passa, Move
é equivalente a outras funções de membro CRecordset
. Em particular, o valor de wFetchType
pode indicar uma função membro mais intuitiva e geralmente o método preferencial para mover o registro atual.
A tabela a seguir lista os valores possíveis para wFetchType
, o conjunto de linhas que Move
buscará com base em wFetchType
e nRows
, e qualquer função de membro equivalente correspondente a wFetchType
.
wFetchType | Conjunto de linhas buscado | Função de membro equivalente |
---|---|---|
SQL_FETCH_RELATIVE (o valor padrão) |
O conjunto de linhas iniciando nRows linha(s) a partir da primeira linha no conjunto de linhas atual. |
|
SQL_FETCH_NEXT |
O próximo conjunto de linhas; nRows é ignorado. |
MoveNext |
SQL_FETCH_PRIOR |
O conjunto de linhas anterior; nRows é ignorado. |
MovePrev |
SQL_FETCH_FIRST |
O primeiro conjunto de linhas no conjunto de registros; nRows é ignorado. |
MoveFirst |
SQL_FETCH_LAST |
O último conjunto de linhas completo no conjunto de registros; nRows é ignorado. |
MoveLast |
SQL_FETCH_ABSOLUTE |
Se nRows > 0, o conjunto de linhas iniciando nRows linha(s) a partir do início do conjunto de registros. Se nRows < 0, o conjunto de linhas iniciando nRows linha(s) a partir do final do conjunto de registros. Se nRows = 0, uma condição BOF (início do arquivo) será retornada. |
SetAbsolutePosition |
SQL_FETCH_BOOKMARK |
O conjunto de linhas que começa na linha cujo valor de indicador corresponde a nRows . |
SetBookmark |
Observação
Para conjuntos de registros somente de encaminhamento, Move
só é válido com um valor de SQL_FETCH_NEXT
para wFetchType
.
Cuidado
Chamar Move
gera uma exceção quando o conjunto de registros não tem registros. Para determinar se o conjunto de registros tem registros, chame IsBOF
e IsEOF
.
Observação
Se você tiver passado do início ou do final do conjunto de registros (IsBOF
ou IsEOF
retornar diferente de zero), chamar uma função Move
possivelmente gerará um CDBException
. Por exemplo, se IsEOF
retornar diferente de zero e IsBOF
não retornar, MoveNext
gerará uma exceção, mas MovePrev
não fará isso.
Observação
Se você chamar Move
enquanto o registro atual estiver sendo atualizado ou adicionado, as atualizações serão perdidas sem aviso.
Para obter mais informações sobre a navegação em conjunto de registros, confira o artigo Conjunto de registros: deslocamento (ODBC) e Conjunto de registros: Indicadores e posições absolutas (ODBC). Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC). Para obter informações relacionadas, confira a função de API ODBC SQLExtendedFetch
no SDK do Windows.
Exemplo
// rs is a CRecordset or a CRecordset-derived object
// Change the rowset size to 5
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// Move to the first record in the recordset
rs.MoveFirst();
// Move to the sixth record
rs.Move(5);
// Other equivalent ways to move to the sixth record:
rs.Move(6, SQL_FETCH_ABSOLUTE);
rs.SetAbsolutePosition(6);
// In this case, the sixth record is the first record in the next rowset,
// so the following are also equivalent:
rs.MoveFirst();
rs.Move(1, SQL_FETCH_NEXT);
rs.MoveFirst();
rs.MoveNext();
CRecordset::MoveFirst
Faz do primeiro registro no primeiro conjunto de linhas o registro atual.
void MoveFirst();
Comentários
Independentemente de a busca em massa de linhas ter sido implementada, esse sempre será o primeiro registro no conjunto de registros.
Você não precisa chamar MoveFirst
imediatamente depois de abrir o conjunto de registros. Nesse momento, o primeiro registro (se houver) é automaticamente o registro atual.
Observação
Essa função de membro não é válida para conjuntos de registros somente encaminhamento.
Observação
Quando você passa por um conjunto de registros, não pode ignorar registros excluídos. Consulte a função de membro IsDeleted
para obter detalhes.
Cuidado
Chamar qualquer uma das funções Move
gera uma exceção se o conjunto de registros não tiver registros. Para determinar se o conjunto de registros tem registros, chame IsBOF
e IsEOF
.
Observação
Se você chamar qualquer uma das funções Move
enquanto o registro atual estiver sendo atualizado ou adicionado, as atualizações serão perdidas sem aviso.
Para obter mais informações sobre a navegação em conjunto de registros, confira o artigo Conjunto de registros: deslocamento (ODBC) e Conjunto de registros: Indicadores e posições absolutas (ODBC). Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Exemplo
Confira o exemplo de IsBOF
.
CRecordset::MoveLast
Faz com que o primeiro registro no último conjunto de linhas completo seja o registro atual.
void MoveLast();
Comentários
Se você não tiver implementado a busca em linha em massa, o conjunto de registros terá um tamanho de conjunto de linhas de 1, portanto, MoveLast
passará para o último registro no conjunto de registros.
Observação
Essa função de membro não é válida para conjuntos de registros somente encaminhamento.
Observação
Quando você passa por um conjunto de registros, não pode ignorar registros excluídos. Consulte a função de membro IsDeleted
para obter detalhes.
Cuidado
Chamar qualquer uma das funções Move
gera uma exceção se o conjunto de registros não tiver registros. Para determinar se o conjunto de registros tem registros, chame IsBOF
e IsEOF
.
Observação
Se você chamar qualquer uma das funções Move
enquanto o registro atual estiver sendo atualizado ou adicionado, as atualizações serão perdidas sem aviso.
Para obter mais informações sobre a navegação em conjunto de registros, confira o artigo Conjunto de registros: deslocamento (ODBC) e Conjunto de registros: Indicadores e posições absolutas (ODBC). Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Exemplo
Confira o exemplo de IsBOF
.
CRecordset::MoveNext
Faz do primeiro registro no próximo conjunto de linhas o registro atual.
void MoveNext();
Comentários
Se você não tiver implementado a busca em linha em massa, o conjunto de registros terá um tamanho de conjunto de linhas de 1, portanto, MoveNext
passará para o próximo registro.
Observação
Quando você passa por um conjunto de registros, não pode ignorar registros excluídos. Consulte a função de membro IsDeleted
para obter detalhes.
Cuidado
Chamar qualquer uma das funções Move
gera uma exceção se o conjunto de registros não tiver registros. Para determinar se o conjunto de registros tem registros, chame IsBOF
e IsEOF
.
Observação
Também é recomendável que você chame IsEOF
antes de chamar MoveNext
. Por exemplo, se você tiver percorrido até além do final do conjunto de registros, IsEOF
retornará diferente de zero; uma chamada subsequente para MoveNext
gerará uma exceção.
Observação
Se você chamar qualquer uma das funções Move
enquanto o registro atual estiver sendo atualizado ou adicionado, as atualizações serão perdidas sem aviso.
Para obter mais informações sobre a navegação em conjunto de registros, confira o artigo Conjunto de registros: deslocamento (ODBC) e Conjunto de registros: Indicadores e posições absolutas (ODBC). Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Exemplo
Confira o exemplo de IsBOF
.
CRecordset::MovePrev
Faz do primeiro registro no conjunto de linhas anterior o registro atual.
void MovePrev();
Comentários
Se você não tiver implementado a busca em linha em massa, o conjunto de registros terá um tamanho de conjunto de linhas de 1, portanto, MovePrev
passará para o próximo registro.
Observação
Essa função de membro não é válida para conjuntos de registros somente encaminhamento.
Observação
Quando você passa por um conjunto de registros, não pode ignorar registros excluídos. Consulte a função de membro IsDeleted
para obter detalhes.
Cuidado
Chamar qualquer uma das funções Move
gera uma exceção se o conjunto de registros não tiver registros. Para determinar se o conjunto de registros tem registros, chame IsBOF
e IsEOF
.
Observação
Também é recomendável que você chame IsBOF
antes de chamar MovePrev
. Por exemplo, se você tiver percorrido até depois do início do conjunto de registros, IsBOF
retornará diferente de zero; uma chamada subsequente para MovePrev
gerará uma exceção.
Observação
Se você chamar qualquer uma das funções Move
enquanto o registro atual estiver sendo atualizado ou adicionado, as atualizações serão perdidas sem aviso.
Para obter mais informações sobre a navegação em conjunto de registros, confira o artigo Conjunto de registros: deslocamento (ODBC) e Conjunto de registros: Indicadores e posições absolutas (ODBC). Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Exemplo
Confira o exemplo de IsBOF
.
CRecordset::OnSetOptions
Chamado para definir opções (usadas na seleção) para a instrução ODBC especificada.
virtual void OnSetOptions(HSTMT hstmt);
Parâmetros
hstmt
O HSTMT
da instrução ODBC cujas opções devem ser definidas.
Comentários
Chame OnSetOptions
para definir opções (usadas na seleção) para a instrução ODBC especificada. A estrutura chama essa função membro para definir opções iniciais para o conjunto de registros. OnSetOptions
determina o suporte da fonte de dados para cursores roláveis e para simultaneidade do cursor e define as opções do conjunto de registros de acordo. (Enquanto OnSetOptions
é usado para operações de seleção, OnSetUpdateOptions
é usado para operações de atualização.)
Substitua OnSetOptions
para definir opções específicas para o driver ou a fonte de dados. Por exemplo, se a fonte de dados der suporte à abertura para acesso exclusivo, você poderá substituir OnSetOptions
para aproveitar essa capacidade.
Para obter mais informações sobre cursores, consulte ODBC.
CRecordset::OnSetUpdateOptions
Chamado para definir opções (usadas na atualização) para a instrução ODBC especificada.
virtual void OnSetUpdateOptions(HSTMT hstmt);
Parâmetros
hstmt
O HSTMT
da instrução ODBC cujas opções devem ser definidas.
Comentários
Chame OnSetUpdateOptions
para definir opções (usadas na atualização) para a instrução ODBC especificada. A estrutura chama essa função de membro depois de criar um HSTMT
para atualizar registros em um conjunto de registros. (Enquanto OnSetOptions
é usado para operações de seleção, OnSetUpdateOptions
é usado para operações de atualização.) OnSetUpdateOptions
determina o suporte da fonte de dados para cursores roláveis e para simultaneidade do cursor e define as opções do conjunto de registros adequadamente.
Substitua OnSetUpdateOptions
para definir opções de uma instrução ODBC antes que essa instrução seja usada para acessar um banco de dados.
Para obter mais informações sobre cursores, consulte ODBC.
CRecordset::Open
Abre o conjunto de registros recuperando a tabela ou executando a consulta que o conjunto de registros representa.
virtual BOOL Open(
UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none);
Parâmetros
nOpenType
Aceite o valor padrão, AFX_DB_USE_DEFAULT_TYPE
, ou use um dos seguintes valores do enum OpenType
:
CRecordset::dynaset
Um conjunto de registros com deslocamento bidirecional. Abrir o conjunto de registros determina a associação e a ordenação dos registros, mas as alterações feitas por outros usuários aos valores de dados ficam visíveis após uma operação de busca. Os dynasets também são conhecidos como conjuntos de registros controlados por conjuntos de chaves.CRecordset::snapshot
Um conjunto de registros estático com deslocamento bidirecional. Abrir o conjunto de registros determina a associação e a ordenação dos registros. Buscar um registro determina os valores de dados. As alterações feitas por outros usuários não ficam visíveis até que o conjunto de registros seja fechado e reaberto.CRecordset::dynamic
Um conjunto de registros com deslocamento bidirecional. As alterações feitas por outros usuários aos valores de associação, ordenação e dados ficam visíveis após uma operação de busca. Muitos drivers ODBC não dão suporte a esse tipo de conjunto de registros.CRecordset::forwardOnly
Um conjunto de registros somente leitura com somente rolagem para a frente.Para
CRecordset
, o valor padrão eCRecordset::snapshot
. O mecanismo de valor padrão permite que os assistentes do Visual C++ interajam com ODBCCRecordset
e DAOCDaoRecordset
, que têm padrões diferentes.
Para obter mais informações sobre esses tipos de conjunto de registros, consulte Conjunto de registros (ODBC). Para obter informações relacionadas, consulte "Usando cursores de bloco e rolável" no SDK do Windows.
Cuidado
Se o tipo solicitado não tiver suporte, a estrutura gerará uma exceção.
lpszSQL
Um ponteiro de cadeia de caracteres que contém um dos seguintes:
Um ponteiro
NULL
.O nome de uma tabela.
Uma instrução SQL
SELECT
(opcionalmente com uma cláusula SQLWHERE
ouORDER BY
).Uma instrução
CALL
que especifica o nome de uma consulta predefinida (procedimento armazenado). Tenha cuidado para não inserir espaço em branco entre a chave e a palavra-chaveCALL
.
Para obter mais informações sobre essa cadeia de caracteres, consulte a tabela e a discussão da função de ClassWizard na seção Comentários.
Observação
A ordem das colunas em seu conjunto de resultados deve corresponder à ordem das chamadas de função RFX ou RFX em massa em sua substituição de função DoFieldExchange
ou DoBulkFieldExchange
.
dwOptions
Uma máscara de bits, que pode especificar uma combinação dos valores listados abaixo. Alguns deles são mutualmente exclusivos. O valor padrão é none
.
CRecordset::none
Nenhuma opção definida. Esse valor de parâmetro é mutuamente exclusivo com todos os outros valores. Por padrão, o conjunto de registros pode ser atualizado comEdit
ouDelete
e permite acrescentar novos registros comAddNew
. A capacidade de atualização depende da fonte de dados e da opçãonOpenType
especificada. A otimização para adições em massa não está disponível. A busca em massa de linhas não será implementada. Os registros excluídos não serão ignorados durante a navegação do conjunto de registros. Indicadores não estão disponíveis. A verificação automática de campo sujo é implementada.CRecordset::appendOnly
Não permitaEdit
ouDelete
no conjunto de registros. Permita somenteAddNew
. Essa opção é mutualmente exclusiva comCRecordset::readOnly
.CRecordset::readOnly
Abra o conjunto de registros como somente leitura. Essa opção é mutualmente exclusiva comCRecordset::appendOnly
.CRecordset::optimizeBulkAdd
Use uma instrução SQL preparada para otimizar a adição de muitos registros ao mesmo tempo. Aplica-se somente se você não estiver usando a função de API ODBCSQLSetPos
para atualizar o conjunto de registros. A primeira atualização determina quais campos estão marcados como sujos. Essa opção é mutualmente exclusiva comCRecordset::useMultiRowFetch
.CRecordset::useMultiRowFetch
Implemente a busca de linha em massa para permitir que várias linhas sejam recuperadas em uma única operação de busca. Esse é um recurso avançado projetado para melhorar o desempenho; no entanto, a troca de campo de registro em massa não é compatível comClassWizard
. Essa opção é mutualmente exclusiva comCRecordset::optimizeBulkAdd
. Se você especificarCRecordset::useMultiRowFetch
, a opçãoCRecordset::noDirtyFieldCheck
será ativada automaticamente (buffer duplo não estará disponível); em conjuntos de registros somente encaminhamento, a opçãoCRecordset::useExtendedFetch
será ativada automaticamente. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).CRecordset::skipDeletedRecords
Ignore todos os registros excluídos ao navegar pelo conjunto de registros. Isso diminuirá o desempenho em determinadas buscas relativas. Essa opção não é válida em conjuntos de registros que sejam somente encaminhamento. Se você chamarMove
com o parâmetro nRows definido como 0 e o conjunto de opçõesCRecordset::skipDeletedRecords
,Move
confirmará.CRecordset::skipDeletedRecords
é semelhante ao empacotamento de driver, o que significa que as linhas excluídas são removidas do conjunto de registros. No entanto, se o driver empacotar registros, ele ignorará apenas os registros que você excluir; ele não ignorará os registros excluídos por outros usuários enquanto o conjunto de registros estiver aberto.CRecordset::skipDeletedRecords
ignorará as linhas excluídas por outros usuários.CRecordset::useBookmarks
Pode usar indicadores no conjunto de registros, se houver suporte. Indicadores reduzem a recuperação de dados, mas melhoram o desempenho para navegação de dados. Não é válido em conjuntos de registros que sejam somente encaminhamento. Para obter mais informações, confira Conjunto de registros: indicadores e posições absolutas (ODBC).CRecordset::noDirtyFieldCheck
Desative a verificação automática de campo sujo (buffer duplo). Isso melhorará o desempenho; no entanto, você deve marcar manualmente campos como sujos chamando as funções de membroSetFieldDirty
eSetFieldNull
. O buffer duplo na classeCRecordset
é semelhante ao buffer duplo na classeCDaoRecordset
. No entanto, emCRecordset
, você não pode habilitar o buffer duplo em campos individuais; habilitá-lo para todos os campos ou desabilitá-lo para todos os campos. Se você especificar a opçãoCRecordset::useMultiRowFetch
,CRecordset::noDirtyFieldCheck
será ativado automaticamente; no entanto,SetFieldDirty
eSetFieldNull
não podem ser usados em conjuntos de registros que implementam a busca de linha em massa.CRecordset::executeDirect
Não use uma instrução SQL preparada. Para melhorar o desempenho, especifique essa opção se a função de membroRequery
nunca for chamada.CRecordset::useExtendedFetch
ImplementeSQLExtendedFetch
em vez deSQLFetch
. Isso foi projetado para implementar a busca de linhas em massa em conjuntos de registros que sejam somente encaminhamento. Se você especificar a opçãoCRecordset::useMultiRowFetch
em um conjunto de registros somente encaminhamento,CRecordset::useExtendedFetch
será ativado automaticamente.CRecordset::userAllocMultiRowBuffers
O usuário alocará buffers de armazenamento para os dados. Use essa opção comCRecordset::useMultiRowFetch
se quiser alocar seu próprio armazenamento. Caso contrário, a estrutura alocará automaticamente o armazenamento necessário. Para obter mais informações, confira Conjunto de registros: buscando registros em massa (ODBC). EspecificarCRecordset::userAllocMultiRowBuffers
sem especificarCRecordset::useMultiRowFetch
resulta em uma declaração com falha.
Valor retornado
Diferente de zero se o objeto CRecordset
foi aberto com êxito; caso contrário, 0 se CDatabase::Open
(se chamado) retornar 0.
Comentários
Você deve chamar essa função de membro para executar a consulta definida pelo conjunto de registros. Antes de chamar Open
, você deve construir o objeto do conjunto de registros.
A conexão desse conjunto de registros com a fonte de dados depende de como você constrói o conjunto de registros antes de chamar Open
. Se você passar um objeto CDatabase
para o construtor do conjunto de registros que não foi conectado à fonte de dados, essa função de membro usará GetDefaultConnect
para tentar abrir o objeto de banco de dados. Se você passar NULL para o construtor do conjunto de registros, o construtor construirá um objeto CDatabase
para você e Open
tentará conectar o objeto de banco de dados. Para obter detalhes sobre como fechar o conjunto de registros e a conexão nessas circunstâncias variadas, confira Close
.
Observação
O acesso a uma fonte de dados por meio de um objeto CRecordset
sempre é compartilhado. Diferentemente da classe CDaoRecordset
, você não pode usar um objeto CRecordset
para abrir uma fonte de dados com acesso exclusivo.
Quando você chama Open
, uma consulta, geralmente uma instrução SQL SELECT
, seleciona registros com base nos critérios mostrados na tabela a seguir.
Valor do parâmetro lpszSQL |
Os registros selecionados são determinados por | Exemplo |
---|---|---|
NULL |
Cadeia de caracteres retornada por GetDefaultSQL . |
|
Nome da tabela SQL | Todas as colunas da lista de tabelas em DoFieldExchange ou DoBulkFieldExchange . |
"Customer" |
Nome da consulta predefinida (procedimento armazenado) | As colunas que a consulta está definida para retornar. | "{call OverDueAccts}" |
lista de tabelas FROM da lista de colunas SELECT |
As colunas especificadas das tabelas especificadas. | "SELECT CustId, CustName FROM Customer" |
Cuidado
Não insira espaço em branco extra na cadeia de caracteres SQL. Por exemplo, se você inserir o espaço em branco entre a chave e a palavra-chave CALL
, o MFC interpretará incorretamente a cadeia de caracteres SQL como um nome de tabela e o incorporará em uma instrução SELECT
, o que resultará na geração de uma exceção. Da mesma forma, se a consulta predefinida usar um parâmetro de saída, não insira o espaço em branco entre a chave e o símbolo ''. Por fim, você não deve inserir espaços em branco antes da chave em uma CALL
instrução ou antes da SELECT
palavra-chave em uma SELECT
instrução.
O procedimento usual é passar NULL
para Open
; nesse caso, Open
chama GetDefaultSQL. Se você estiver usando uma classe CRecordset
derivada, GetDefaultSQL
fornecerá os nomes de tabela especificados em ClassWizard
. Em vez disso, você pode especificar outras informações no parâmetro lpszSQL
.
Independentemente do que você passar, Open
constrói uma cadeia de caracteres SQL final para a consulta (a cadeia de caracteres pode ter cláusulas SQL WHERE
e ORDER BY
acrescentadas à cadeia de caracteres lpszSQL
que você passou) e, em seguida, executa a consulta. Você pode examinar a cadeia de caracteres construída chamando GetSQL
depois de chamar Open
. Para obter mais detalhes sobre como o conjunto de registros constrói uma instrução SQL e seleciona registros, consulte Conjunto de registros: Como conjuntos de registros selecionam registros (ODBC).
Os membros de dados de campo da classe de conjunto de registros são associados às colunas dos dados selecionados. Se algum registro for retornado, o primeiro registro se tornará o registro atual.
Se você quiser definir opções para o conjunto de registros, como um filtro ou uma classificação, especifique-os depois de construir o objeto do conjunto de registros, mas antes de chamar Open
. Se você quiser atualizar os registros no conjunto de registros depois que o conjunto de registros já estiver aberto, chame Requery
.
Para obter mais informações, incluindo mais exemplos, consulte Conjunto de registros (ODBC),Conjunto de registros: Como conjuntos de registros selecionam registros (ODBC) e Conjunto de registros: Criando e fechando conjuntos de registros (ODBC).
Exemplo
Os exemplos de código a seguir mostram diferentes formas da chamada Open
.
// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived
// objects
// Open rs using the default SQL statement, implement bookmarks, and turn
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks |
CRecordset::noDirtyFieldCheck);
// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));
// Accept all defaults
rsDefault.Open();
CRecordset::RefreshRowset
Atualizações os dados e o status de uma linha no conjunto de linhas atual.
void RefreshRowset(
WORD wRow,
WORD wLockType = SQL_LOCK_NO_CHANGE);
Parâmetros
wRow
A posição baseada em um de uma linha no conjunto de linhas atual. Esse valor pode variar de 1 até o tamanho do conjunto de linhas.
wLockType
Um valor que indica como bloquear a linha após a atualização. Para obter detalhes, consulte Observações.
Comentários
Se você passar um valor de zero para wRow
, cada linha no conjunto de linhas será atualizada.
Para usar RefreshRowset
, você deve ter implementado a busca de linhas em massa especificando a opção CRecordset::useMulitRowFetch
na função de membro Open
.
RefreshRowset
chama a função de API ODBC SQLSetPos
. O parâmetro wLockType
especifica o estado de bloqueio da linha após a execução de SQLSetPos
. A tabela a seguir descreve os valores possíveis de wLockType
.
wLockType | Descrição |
---|---|
SQL_LOCK_NO_CHANGE (o valor padrão) |
O driver ou a fonte de dados garante que a linha esteja no mesmo estado bloqueado ou desbloqueado como era antes de RefreshRowset ser chamado. |
SQL_LOCK_EXCLUSIVE |
O driver ou a fonte de dados bloqueia a linha exclusivamente. Nem todas as fontes de dados suportam esse tipo de bloqueio. |
SQL_LOCK_UNLOCK |
O driver ou a fonte de dados desbloqueia a linha. Nem todas as fontes de dados suportam esse tipo de bloqueio. |
Para obter mais informações sobre SQLSetPos
, consulte o SDK do Windows. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
CRecordset::Requery
Recompila (atualiza) um conjunto de registros.
virtual BOOL Requery();
Valor retornado
Diferente de zero se o conjunto de registros foi recriado com êxito; caso contrário, 0.
Comentários
Se algum registro for retornado, o primeiro registro se tornará o registro atual.
Para que o conjunto de registros reflita as adições e exclusões que você ou outros usuários estão fazendo à fonte de dados, você deve recompilar o conjunto de registros chamando Requery
. Se o conjunto de registros for um dynaset, ele refletirá automaticamente as atualizações que você ou outros usuários fazem em seus registros existentes (mas não adições). Se o conjunto de registros for um instantâneo, você deverá chamar Requery
para refletir edições de outros usuários, além de adições e exclusões.
Para um dynaset ou um snapshot, chame Requery
sempre que quiser recompilar o conjunto de registros usando um novo filtro ou classificação, ou valores de parâmetro. Defina o novo filtro ou propriedade de classificação atribuindo novos valores para m_strFilter
e m_strSort
antes de chamar Requery
. Defina novos parâmetros atribuindo novos valores a membros de dados de parâmetro antes de chamar Requery
. Se as cadeias de caracteres de filtro e classificação não forem alteradas, você poderá reutilizar a consulta, o que melhora o desempenho.
Se a tentativa de recompilar o conjunto de registros falhar, o conjunto de registros será fechado. Antes de chamar Requery
, você pode determinar se o conjunto de registros pode ser requerido chamando a função de membro CanRestart
. CanRestart
não garante que Requery
terá êxito.
Cuidado
Chame Requery
somente depois que você tiver chamado Open
.
Exemplo
Este exemplo recompila um conjunto de registros para aplicar uma ordem de classificação diferente.
CCustomer rsCustSet(&m_dbCust);
// Open the recordset
rsCustSet.Open();
// Use the recordset ...
// Set the sort order and Requery the recordset
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
if (!rsCustSet.CanRestart())
return; // Unable to requery
if (!rsCustSet.Requery())
// Requery failed, so take action
AfxMessageBox(_T("Requery failed!"));
CRecordset::SetAbsolutePosition
Posiciona o conjunto de registros no registro correspondente ao número de registro especificado.
void SetAbsolutePosition(long nRows);
Parâmetros
nRows
A posição ordinal baseada em um para o registro atual no conjunto de registros.
Comentários
SetAbsolutePosition
move o ponteiro de registro atual com base nessa posição ordinal.
Observação
Essa função de membro não é válida em conjuntos de registros somente encaminhamento.
Para conjuntos de registros ODBC, uma configuração de posição absoluta de 1 refere-se ao primeiro registro no conjunto de registros; uma configuração de 0 refere-se à posição de INÍCIO do arquivo (BOF).
Você também pode passar valores negativos para SetAbsolutePosition
. Nesse caso, a posição do conjunto de registros é avaliada do final do conjunto de registros. Por exemplo, SetAbsolutePosition( -1 )
move o ponteiro de registro atual para o último registro no conjunto de registros.
Observação
A posição absoluta não se destina a ser usada como um número de registro substituto. Os indicadores ainda são a maneira recomendada de reter e retornar a uma determinada posição, uma vez que a posição de um registro é alterada quando os registros anteriores são excluídos. Além disso, não há garantia de que um determinado registro terá a mesma posição absoluta se o conjunto de registros for recriado novamente porque a ordem dos registros individuais dentro de um conjunto de registros não é garantida, a menos que seja criada com uma instrução SQL usando uma cláusula ORDER BY
.
Para obter mais informações sobre navegação de conjunto de registros e indicadores, consulte os artigos Conjunto de registros: Deslocamento (ODBC) e Conjunto de registros: Indicadores e posições absolutas (ODBC).
CRecordset::SetBookmark
Posiciona o conjunto de registros no registro que contém o indicador especificado.
void SetBookmark(const CDBVariant& varBookmark);
Parâmetros
varBookmark
Uma referência a um objeto CDBVariant
que contém o valor do indicador para um registro específico.
Comentários
Para determinar se há suporte para indicadores no conjunto de registros, chame CanBookmark
. Para disponibilizar indicadores se eles tiverem suporte, você deve definir a opção CRecordset::useBookmarks
no parâmetro dwOptions
da função de membro Open
.
Observação
Se os indicadores não tiverem suporte ou não estiverem disponíveis, chamar SetBookmark
resultará na geração de uma exceção. Não há suporte para indicadores em conjuntos de registros que sejam somente encaminhamento.
Para primeiro recuperar o indicador do registro atual, chame GetBookmark
, que salva o valor do indicador em um objeto CDBVariant
. Depois, você pode retornar a esse registro chamando SetBookmark
usando o valor do indicador salvo.
Observação
Após determinadas operações de conjunto de registros, você deve verificar a persistência do indicador antes de chamar SetBookmark
. Por exemplo, se você recuperar um indicador com GetBookmark
e depois chamar Requery
, o indicador pode não ser mais válido. Chame CDatabase::GetBookmarkPersistence
para verificar se você pode chamar SetBookmark
com segurança.
Para obter mais informações sobre indicadores e navegação de conjunto de registros, consulte os artigos Conjunto de registros: indicadores e posições absolutas (ODBC) e Conjunto de registros: deslocamento (ODBC).
CRecordset::SetFieldDirty
Sinaliza um membro de dados de campo do conjunto de registros como alterado ou inalterado.
void SetFieldDirty(void* pv, BOOL bDirty = TRUE);
Parâmetros
pv
Contém o endereço de um membro de dados de campo no conjunto de registros ou NULL
. Se for NULL
, todos os membros de dados de campo no conjunto de registros serão sinalizados. (O NULL
do C++ não é o mesmo que Null na terminologia do banco de dados, o que significa "sem valor".)
bDirty
TRUE
se o membro de dados de campo deve ser sinalizado como "sujo" (alterado). Caso contrário, FALSE
se o membro de dados de campo for sinalizado como "limpo" (inalterado).
Comentários
Marcar campos como inalterados garante que o campo não seja atualizado e resulte em menos tráfego SQL.
Observação
Essa função de membro não é aplicável em conjuntos de registros que estão usando a busca em massa de linhas. Se você tiver implementado a busca de linhas em massa, SetFieldDirty
resultará em uma declaração com falha. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
A estrutura marca os membros de dados de campo alterados para garantir que eles serão gravados no registro na fonte de dados pelo mecanismo RFX (troca de campo de registro). Alterar o valor de um campo geralmente define o campo sujo automaticamente, portanto, você raramente precisará chamar SetFieldDirty
por conta própria, mas às vezes você pode querer garantir que as colunas sejam explicitamente atualizadas ou inseridas independentemente do valor no membro de dados de campo.
O uso de NULL
para o primeiro argumento da função aplicará a função somente aos campos outputColumn
, não campos a param
. Por exemplo, a chamada
SetFieldNull(NULL);
definirá apenas campos outputColumn
como NULL
; campos param
não serão afetados.
Para trabalhar em campos param
, você deve fornecer o endereço real do param
individual no qual deseja trabalhar, como:
SetFieldNull(&m_strParam);
Isso significa que você não pode definir todos os campos param
para NULL
, como você pode com campos outputColumn
.
CRecordset::SetFieldNull
Sinaliza um membro de dados de campo do conjunto de registros como Null (especificamente sem valor) ou como não Null.
void SetFieldNull(void* pv, BOOL bNull = TRUE);
Parâmetros
pv
Contém o endereço de um membro de dados de campo no conjunto de registros ou NULL
. Se for NULL
, todos os membros de dados de campo no conjunto de registros serão sinalizados. (O NULL
do C++ não é o mesmo que Null na terminologia do banco de dados, o que significa "sem valor".)
bNull
Diferente zero se o for preciso sinalizar o membro de dados do campo como sem valor (Null). Caso contrário, 0 se o membro de dados de campo for sinalizado como não nulo.
Comentários
Quando você adiciona um novo registro a um conjunto de registros, todos os membros de dados de campo são inicialmente definidos como um valor nulo e sinalizados como "sujos" (alterados). Quando você recupera um registro de uma fonte de dados, suas colunas já têm valores ou são nulas.
Observação
Não chame essa função de membro em conjuntos de registros que estão usando a busca em massa de linhas. Se você tiver implementado a busca de linhas em massa, chamar SetFieldNull
resultará em uma declaração com falha. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Se você quiser designar especificamente um campo do registro atual como não tendo um valor, chame SetFieldNull
com bNull
definido como TRUE
para sinalizar como Null. Se um campo tiver sido marcado anteriormente como Nulo e você quiser dar a ele um valor, defina seu novo valor. Você não precisa remover o sinalizador Null com SetFieldNull
. Para determinar se o campo tem permissão para ser nulo, chame IsFieldNullable
.
O uso de NULL
para o primeiro argumento da função aplicará a função somente aos campos outputColumn
, não campos a param
. Por exemplo, a chamada
SetFieldNull(NULL);
definirá apenas campos outputColumn
como NULL
; campos param
não serão afetados.
Para trabalhar em campos param
, você deve fornecer o endereço real do param
individual no qual deseja trabalhar, como:
SetFieldNull(&m_strParam);
Isso significa que você não pode definir todos os campos param
para NULL
, como você pode com campos outputColumn
.
Observação
Ao definir parâmetros como Null, uma chamada para SetFieldNull
antes que o conjunto de registros seja aberto resulta em uma asserção. Nesse caso, chame SetParamNull
.
SetFieldNull
é implementado por meio de DoFieldExchange
.
CRecordset::SetLockingMode
Define o modo de bloqueio como bloqueio "otimista" (o padrão) ou bloqueio "pessimista". Determina como os registros são bloqueados para atualizações.
void SetLockingMode(UINT nMode);
Parâmetros
nMode
Contém um dos seguintes valores do enum LockMode
:
optimistic
O bloqueio otimista bloqueia o registro que está sendo atualizado somente durante a chamada paraUpdate
.pessimistic
O bloqueio pessimista bloqueia o registro assim queEdit
é chamado e o mantém bloqueado até que a chamadaUpdate
seja concluída ou você passe para um novo registro.
Comentários
Chame essa função de membro se você precisar especificar qual das duas estratégias de bloqueio de registro que o conjunto de registros está usando para atualizações. Por padrão, o modo de bloqueio de um conjunto de registros é optimistic
. Você pode alterar isso para uma estratégia de bloqueio pessimistic
mais cautelosa. Chame SetLockingMode
depois de construir e abrir o objeto do conjunto de registros, mas antes de chamar Edit
.
CRecordset::SetParamNull
Sinaliza um parâmetro como Null (especificamente sem valor) ou como não Null.
void SetParamNull(
int nIndex,
BOOL bNull = TRUE);
Parâmetros
nIndex
O índice baseado em zero do parâmetro.
bNull
Se for TRUE
(o valor padrão), o parâmetro será sinalizado como Null. Caso contrário, o parâmetro será sinalizado como não Null.
Comentários
Diferentemente de SetFieldNull
, você pode chamar SetParamNull
antes de abrir o conjunto de registros.
SetParamNull
normalmente é usado com consultas predefinidas (procedimentos armazenados).
CRecordset::SetRowsetCursorPosition
Move o cursor para uma linha dentro do conjunto de linhas atual.
void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);
Parâmetros
wRow
A posição baseada em um de uma linha no conjunto de linhas atual. Esse valor pode variar de 1 até o tamanho do conjunto de linhas.
wLockType
Valor que indica como bloquear a linha após a atualização. Para obter detalhes, consulte Observações.
Comentários
Ao implementar a busca de linhas em massa, os registros são recuperados por conjuntos de linhas, em que o primeiro registro no conjunto de linhas buscado é o registro atual. Para fazer outro registro dentro do conjunto de linhas do registro atual, chame SetRowsetCursorPosition
. Por exemplo, você pode combinar SetRowsetCursorPosition
com a função de membro GetFieldValue
para recuperar dinamicamente os dados de qualquer registro do conjunto de registros.
Para usar SetRowsetCursorPosition
, você deve ter implementado a busca de linhas em massa especificando a opção CRecordset::useMultiRowFetch
do parâmetro dwOptions
na função de membro Open
.
SetRowsetCursorPosition
chama a função de API ODBC SQLSetPos
. O parâmetro wLockType
especifica o estado de bloqueio da linha após a execução de SQLSetPos
. A tabela a seguir descreve os valores possíveis de wLockType
.
wLockType |
Descrição |
---|---|
SQL_LOCK_NO_CHANGE (o valor padrão) |
O driver ou a fonte de dados garante que a linha esteja no mesmo estado bloqueado ou desbloqueado como era antes de SetRowsetCursorPosition ser chamado. |
SQL_LOCK_EXCLUSIVE |
O driver ou a fonte de dados bloqueia a linha exclusivamente. Nem todas as fontes de dados suportam esse tipo de bloqueio. |
SQL_LOCK_UNLOCK |
O driver ou a fonte de dados desbloqueia a linha. Nem todas as fontes de dados suportam esse tipo de bloqueio. |
Para obter mais informações sobre SQLSetPos
, consulte o SDK do Windows. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
CRecordset::SetRowsetSize
Especifica o número de registros que você deseja recuperar durante uma busca.
virtual void SetRowsetSize(DWORD dwNewRowsetSize);
Parâmetros
dwNewRowsetSize
O número de linhas a serem recuperadas durante uma determinada busca.
Comentários
Essa função de membro virtual especifica quantas linhas você deseja recuperar durante uma única busca ao usar a busca de linhas em massa. Para implementar a busca de linhas em massa, você deve definir a opção CRecordset::useMultiRowFetch
no parâmetro dwOptions
da função de membro Open
.
Observação
Chamar SetRowsetSize
sem implementar a busca de linhas em massa resultará em uma declaração com falha.
Chame SetRowsetSize
antes de chamar Open
para definir inicialmente o tamanho do conjunto de linhas para o conjunto de registros. O tamanho padrão do conjunto de linhas ao implementar a busca de linhas em massa é 25.
Observação
Tenha cuidado ao chamar SetRowsetSize
. Se você estiver alocando manualmente o armazenamento para os dados (conforme especificado pela opção CRecordset::userAllocMultiRowBuffers
do parâmetro dwOptions em Open
), verifique se precisa realocar esses buffers de armazenamento depois de chamar SetRowsetSize
, mas antes de executar qualquer operação de navegação de cursor.
Para obter a configuração atual para o tamanho do conjunto de linhas, chame GetRowsetSize
.
Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
CRecordset::Update
Conclui uma operação AddNew
ou Edit
salvando os dados novos ou editados na fonte de dados.
virtual BOOL Update();
Valor retornado
Diferente de zero se um registro tiver sido atualizado com êxito; caso contrário, 0 se nenhuma coluna tiver sido alterada. Se nenhum registro tiver sido atualizado ou se mais de um registro tiver sido atualizado, uma exceção será gerada. Uma exceção também é gerada para qualquer outra falha na fonte de dados.
Comentários
Chame essa função de membro após uma chamada para a função de membro AddNew
ou Edit
. Essa chamada é necessária para concluir a operação AddNew
ou Edit
.
Observação
Se você implementou a busca de linhas em massa, não poderá chamar Update
. Isso resultará em uma declaração com falha. Embora a classe CRecordset
não forneça um mecanismo para atualizar linhas de dados em massa, você pode escrever suas próprias funções usando a função API ODBC SQLSetPos
. Para obter mais informações sobre busca de linhas em massa, confira Conjunto de registros: buscando registros em massa (ODBC).
Tanto AddNew
quanto Edit
preparam um buffer de edição no qual os dados adicionados ou editados são colocados para salvar na fonte de dados. Update
salva os dados. Somente os campos marcados ou detectados como alterados são atualizados.
Se a fonte de dados suportar transações, você fazer Update
chamar (e sua chamada AddNew
ou Edit
correspondente) parte de uma transação. Para obter mais informações sobre transações, confira Transação (ODBC).
Cuidado
Se você chamar Update
sem chamar AddNew
ou Edit
primeiro, Update
gerará um CDBException
. Se você chamar AddNew
ou Edit
, precisa chamar Update
antes de chamar uma operação Move
ou antes de fechar o conjunto de registros ou a conexão da fonte de dados. Caso contrário, suas alterações serão perdidas sem notificação.
Para obter detalhes sobre como lidar com falhas Update
, consulte Conjunto de registros: Como conjuntos de registros atualizam registros (ODBC).
Exemplo
confira Transação: realizando uma transação em um conjunto de registros (ODBC).
Confira também
CObject
classe
Gráfico de hierarquia
CDatabase
classe
CRecordView
classe