Compartilhar via


db_command

Cria um comando OLE DB.

Sintaxe

[ db_command(command, name, source_name, hresult, bindings, bulk_fetch) ]

Parâmetros

command
Uma cadeia de caracteres de comando que contém o texto de um comando OLE DB. Um exemplo simples é:

[ db_command ( command = "Select * from Products" ) ]

A sintaxe de command é a seguinte:

bloco de parâmetro de associação 1
  Comando OLE DB
bloco de parâmetro de associação 2
  continuação do comando OLE DB
bloco de parâmetro de associação 3
...

Um bloco de parâmetro de associação é definido da seguinte maneira:

(bindtype szVar1 [, szVar2 [, nVar3 [, ...]]])

em que:

  • ( marca o início do bloco de associação de dados.

  • bindtype é uma das cadeias de caracteres a seguir que não diferenciam maiúsculas de minúsculas:

    • [db_column] associa cada uma das variáveis de membro a uma coluna em um conjunto de linhas.

    • [bindto] (mesmo que [db_column]).

    • [in] associa variáveis de membro como parâmetros de entrada.

    • [out] associa variáveis de membro como parâmetros de saída.

    • [in,out] associa variáveis de membro como parâmetros de entrada/saída.

  • szVarN, nVarN resolvem para variáveis de membro dentro do escopo atual.

  • ) marca o fim do bloco de associação de dados.

Se a cadeia de caracteres de comando contiver um ou mais especificadores, como [in], [out] ou [in/out], db_command criará um mapa de parâmetros.

Se a cadeia de caracteres de comando contiver um ou mais parâmetros como [db_column] ou [bindto], em seguida db_command gerará um conjunto de linhas e um mapa do acessador para atender a essas variáveis associadas. Para obter mais informações, consulte db_accessor.

Observação

A sintaxe de bindtype e o parâmetro bindings não são válidos ao usar db_command no nível da classe.

A seguir estão alguns exemplos de blocos de parâmetro de associação. O exemplo a seguir associa os membros de dados m_au_fname e m_au_lname às colunas au_fname e au_lname, respectivamente, da tabela de autores no banco de dados pubs:

TCHAR m_au_fname[21];
TCHAR m_au_lname[41];
TCHAR m_state[3] = 'CA';

[db_command (command = "SELECT au_fname([bindto]m_au_fname), au_lname([bindto]m_au_lname) " \
   "FROM dbo.authors " \
   "WHERE state = ?([in]m_state)")
]

name
(Opcional) O nome do identificador usado para trabalhar com o conjunto de linhas. Se você especificar name, db_command gerará uma classe com a name especificada, que pode ser usada para percorrer o conjunto de linhas ou para executar várias consultas de ação. Se você não especificar name, não será possível retornar mais de uma linha de resultados ao usuário.

source_name
(Opcional) A variável CSession ou instância de uma classe que tem o atributo db_source aplicado a ela na qual o comando é executado. Consulte db_source.

db_command verifica se a variável usada por source_name é válida, portanto, a variável especificada deve estar na função ou no escopo global.

hresult
(Opcional) Identifica a variável que receberá o HRESULT desse comando de banco de dados. Se a variável não existir, ela será injetada automaticamente pelo atributo.

bindings
(Opcional) Permite separar os parâmetros de associação do comando OLE DB.

Se você especificar um valor para bindings, db_command analisará o valor associado e não analisará o parâmetro bindtype. Esse uso permite que você use a sintaxe do provedor OLE DB. Para desabilitar a análise sem parâmetros de associação, especifique Bindings="".

Se não for especificado um valor para bindings, db_command analisará o bloco de parâmetros de associação. Ele procura '(', seguido por um bindtype entre colchetes, seguidos por uma ou mais variáveis de membro C++ declaradas anteriormente, seguidas por ')'. Ele remove todo o texto entre os parênteses do comando resultante. Esses parâmetros são usados para construir associações de coluna e parâmetro para esse comando.

bulk_fetch
(Opcional) Um valor inteiro que especifica o número de linhas a ser efetuado fetch.

O valor padrão é 1, que especifica a busca de linha única (o conjunto de linhas será do tipo CRowset).

Um valor maior que 1 especifica a busca em de linhas em massa. A busca de linhas em massa refere-se à capacidade de conjuntos de linhas em massa buscar várias alças de linha (o conjunto de linhas será do tipo CBulkRowset e chamará SetRows com o número especificado de linhas).

Se bulk_fetch for menor que um, SetRows retornará zero.

Comentários

db_command cria um objeto CCommand, que é usado por um consumidor OLE DB para executar um comando.

Você pode usar db_command com o escopo de classe ou função; a principal diferença é o escopo do objeto CCommand. Com o escopo da função, dados como associações terminam no final da função. Os usos de classe e escopo de função envolvem a classe modelo de consumidor OLE DB CCommand<>, mas os argumentos de modelo diferem para os casos de função e classe. No caso de função, as associações serão feitas a um Accessor, que inclua variáveis locais, enquanto o uso da classe inferirá uma classe derivada de CAccessor como o argumento. Quando usado como um atributo de classe, db_command funciona em conjunto com db_column.

db_command pode ser usado para executar comandos que não retornam um conjunto de resultados.

Quando o provedor de atributos de consumidor aplica esse atributo a uma classe, o compilador renomeia a classe para _[YourClassName]Accessor, onde [YourClassName] é o nome que você deu à classe. O compilador também cria uma classe chamada [YourClassName], que deriva de _[YourClassName]Accessor. No Modo de Exibição de Classe, você verá ambas as classes.

Exemplos

Esta amostra define um comando que seleciona o primeiro e os sobrenomes de uma tabela em que a coluna de estado corresponde a 'CA'. db_command cria e lê um conjunto de linhas no qual você pode chamar funções geradas pelo assistente, como OpenAll e CloseAll, bem como funções de membro CRowset, como MoveNext.

Esse código exige que você forneça sua própria cadeia de conexão que se conecta ao banco de dados pubs. Para obter informações sobre como fornecer uma cadeia de conexão no ambiente de desenvolvimento, consulte Como se conectar a um banco de dados e procurar objetos existentes e Adicionar novas conexões.

Arquivo de origem db_command.h:

// db_command.h
#include <atlbase.h>
#include <atlplus.h>
#include <atldbcli.h>

#pragma once

[  db_source(L"your connection string"), db_command(L" \
      SELECT au_lname, au_fname \
      FROM dbo.authors \
      WHERE state = 'CA'")  ]

struct CAuthors {
   // In order to fix several issues with some providers, the code below may bind
   // columns in a different order than reported by the provider

   DBSTATUS m_dwau_lnameStatus;
   DBSTATUS m_dwau_fnameStatus;
   DBLENGTH m_dwau_lnameLength;
   DBLENGTH m_dwau_fnameLength;

   [ db_column("au_lname", status="m_dwau_lnameStatus", length="m_dwau_lnameLength") ] TCHAR m_au_lname[41];
   [ db_column("au_fname", status="m_dwau_fnameStatus", length="m_dwau_fnameLength") ] TCHAR m_au_fname[21];

   [ db_param("7", paramtype="DBPARAMIO_INPUT") ] TCHAR m_state[3];

   void GetRowsetProperties(CDBPropSet* pPropSet) {
      pPropSet->AddProperty(DBPROP_CANFETCHBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
      pPropSet->AddProperty(DBPROP_CANSCROLLBACKWARDS, true, DBPROPOPTIONS_OPTIONAL);
   }
};

Arquivo de origem db_command.cpp:

// db_command.cpp
// compile with: /c
#include "db_command.h"

int main(int argc, _TCHAR* argv[]) {
   HRESULT hr = CoInitialize(NULL);

   // Instantiate rowset
   CAuthors rs;

   // Open rowset and move to first row
   strcpy_s(rs.m_state, sizeof(rs.m_state), _T("CA"));
   hr = rs.OpenAll();
   hr = rs.MoveFirst();

   // Iterate through the rowset
   while( SUCCEEDED(hr) && hr != DB_S_ENDOFROWSET ) {
      // Print out the column information for each row
      printf("First Name: %s, Last Name: %s\n", rs.m_au_fname, rs.m_au_lname);
      hr = rs.MoveNext();
   }

   rs.CloseAll();
   CoUninitialize();
}

Esta amostra usa db_source em uma classe de fonte de dados e CMySource db_command em classes de comando CCommand1 e CCommand2.

// db_command_2.cpp
// compile with: /c
#include <atlbase.h>
#include <atlplus.h>
#include <atldbcli.h>
// class usage for both db_source and db_command

[  db_source(L"your connection string"), db_command(L" \
      SELECT au_lname, au_fname \
      FROM dbo.authors \
      WHERE state = 'CA'")  ]
struct CMySource {
   HRESULT OpenDataSource() {
      return S_OK;
   }
};

[db_command(command = "SELECT * FROM Products")]
class CCommand1 {};

[db_command(command = "SELECT FNAME, LNAME FROM Customers")]
class CCommand2 {};

int main() {
   CMySource s;
   HRESULT hr = s.OpenDataSource();
   if (SUCCEEDED(hr)) {
      CCommand1 c1;
      hr = c1.Open(s);

      CCommand2 c2;
      hr = c2.Open(s);
   }

   s.CloseDataSource();
}

Requisitos

Contexto do atributo Valor
Aplicável ao class, struct, membro, método, local
Repetível Não
Atributos obrigatórios Nenhum
Atributos inválidos Nenhum

Para obter mais informações sobre os contextos de atributo, consulte Contextos de atributo.

Confira também

Atributos do consumidor OLE DB
Atributos autônomos