Compartilhar via


Usando vários acessos em um conjunto de linhas

Há três cenários básicos nos quais você precisa usar acessadores vários:

  • Vários conjuntos de linhas de leitura/gravar. Nesse cenário, você tiver uma tabela com uma chave primária.Você deseja ser capaz de ler todas as colunas na linha, incluindo a chave primária.Você também queira ser capaz de gravar dados em todas as colunas, exceto a chave primária (porque não é possível gravar a coluna de chave primária).Nesse caso, é conjunto dois acessadores:

    • Acessador 0 contém todas as colunas.

    • Acessador 1 contém todas as colunas, exceto a chave primária.

  • Desempenho. Nesse cenário, um ou mais colunas contêm uma grande quantidade de dados, por exemplo, elementos gráficos, som ou vídeo arquivos.Sempre que você mover uma linha, provavelmente não desejar recuperar a coluna com o arquivo de dados grandes, porque ao fazer isso assim, seria lento o desempenho do aplicativo.

    Você pode conjunto até separar acessadores na qual o acessador primeiro contém todas as colunas, exceto a com dados grandes, e ele automaticamente recupera dados dessas colunas; este é o acessador automática.O acessador segundo recupera somente a coluna que contém dados grandes, mas ele não recupera dados nesta coluna automaticamente.Você pode ter outros métodos de atualizar ou buscar os dados de grandes demanda.

    • Acessador 0 é um acessador automático; ele recupera todas as colunas, exceto a com dados grandes.

    • Acessador 1 não é um acessador automático; ele recupera a coluna com dados grandes.

    Use o argumento de automática para especificar se o acessador é um acessador automática.

  • Várias colunas ISequentialStream. Nesse cenário, você tem mais de uma coluna contendo ISequentialStream dados. No entanto, cada acessador é limitado a um ISequentialStream fluxo de dados. Para resolver esse problema, configure diversos acessadores, cada uma contendo um ISequentialStream ponteiro.

Você normalmente cria acessadores usando o BEGIN_ACCESSOR and END_ACCESSOR macros.Você também pode usar o db_accessor atributo.(Acessadores são descritos posteriormente na Registros de usuário.) As macros ou o atributo de especificar se um acessador é automático ou um acessador não automática:

  • Em um acessador automático, mover métodos, sistema autônomo MoveFirst, MoveLast, MoveNext, e MovePrev recupere dados para todas sistema autônomo colunas especificadas automaticamente. Acessador 0 deve ser o acessador automático.

  • Em um acessador não automático, a recuperação não ocorre até que você chamar um método sistema autônomo explicitamenteAtualização, Inserir, Buscar, or Excluir.Nos cenários descritos acima, você talvez não queira recuperar todas as colunas em cada movimentação.Pode colocar uma ou mais colunas em um acessador separado e certifique de que um acessador não automático, sistema autônomo mostrado abaixo.

O exemplo a seguir utiliza diversos acessadores para ler e gravar a tabela de trabalhos de pubs no banco de dados do SQL servidor usando diversos acessadores.Este é o uso mais comum de vários acessadores; consulte o cenário de "mais vários conjuntos de leitura/gravar" acima.

A classe de registro do usuário é o seguinte:Define dois acessadores: acessador 0 contém somente a coluna de chave primária (ID) e contém acessador 1 Outros colunas.

class CJobs
{
public:
    enum {
        sizeOfDescription = 51
    };

    short nID;
    char szDescription[ sizeOfDescription ];
    short nMinLvl;
    short nMaxLvl;

    DWORD dwID;
    DWORD dwDescription;
    DWORD dwMinLvl;
    DWORD dwMaxLvl;

BEGIN_ACCESSOR_MAP(CJobs, 2)
    // Accessor 0 is the automatic accessor
    BEGIN_ACCESSOR(0, true)
        COLUMN_ENTRY_STATUS(1, nID, dwID)
    END_ACCESSOR()
    // Accessor 1 is the non-automatic accessor
    BEGIN_ACCESSOR(1, true)
        COLUMN_ENTRY_STATUS(2, szDescription, dwDescription)
        COLUMN_ENTRY_STATUS(3, nMinLvl, dwMinLvl)
        COLUMN_ENTRY_STATUS(4, nMaxLvl, dwMaxLvl)
    END_ACCESSOR()
END_ACCESSOR_MAP()
};

O código principal é sistema autônomo segue. De chamadaMoveNext recupera dados automaticamente da ID de coluna de chave primária usando acessador 0. Observação como a Inserir método no participante usa acessador 1 para evitar a coluna de chave primária.

int main(int argc, char* argv[])
{
    // Initalize COM
    ::CoInitialize(NULL);

    // Create instances of the data source and session
    CDataSource source;
    CSession session;
    HRESULT hr = S_OK;

    // Set initialization properties
    CDBPropSet dbinit(DBPROPSET_DBINIT);
    dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR("my_user_id"));
    dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR("pubs"));
    dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR("(local)"));

    hr = source.Open("SQLOLEDB.1", &dbinit);
    if (hr == S_OK)
    {
        hr = session.Open(source);
        if (hr == S_OK)
        {
            // Ready to fetch/access data
            CTable<CAccessor<CJobs> > jobs;

            // Set properties for making the rowset a read/write cursor
            CDBPropSet dbRowset(DBPROPSET_ROWSET);
            dbRowset.AddProperty(DBPROP_CANFETCHBACKWARDS, true);
            dbRowset.AddProperty(DBPROP_CANSCROLLBACKWARDS, true);
            dbRowset.AddProperty(DBPROP_IRowsetChange, true);
            dbRowset.AddProperty(DBPROP_UPDATABILITY,
                DBPROPVAL_UP_INSERT | DBPROPVAL_UP_CHANGE |
                DBPROPVAL_UP_DELETE);
   
            hr = jobs.Open(session, "jobs", &dbRowset);
            if (hr == S_OK)
            {
                // Calling MoveNext automatically retrieves ID
                // (using accessor 0)
                while(jobs.MoveNext() == S_OK)
                   printf_s("Description = %s\n", jobs.szDescription);

                hr = jobs.MoveFirst();
                if (hr == S_OK)
                {
                    jobs.nID = 25;
                    strcpy_s(&jobs.szDescription[0],
                             jobs.sizeOfDescription,
                             "Developer");
                    jobs.nMinLvl = 10;
                    jobs.nMaxLvl = 20;

                    jobs.dwDescription = DBSTATUS_S_OK;
                    jobs.dwID = DBSTATUS_S_OK;
                    jobs.dwMaxLvl = DBSTATUS_S_OK;
                    jobs.dwMinLvl = DBSTATUS_S_OK;

                    // Insert method uses accessor 1
                    // (to avoid writing to the primary key column)
                    hr = jobs.Insert(1);   
                }
                jobs.Close();
            }
            session.Close();
        }
        source.Close();
    }

    // Uninitialize COM
    ::CoUninitialize();
    return 0;
}

Consulte também

Conceitos

Usar acessadores

Registros de usuário