db_command

Tworzy polecenie OLE DB.

Składnia

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

Parametry

command
Ciąg polecenia zawierający tekst polecenia OLE DB. Prostym przykładem jest:

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

Składnia command jest następująca:

blok parametrów powiązania 1
  Polecenie OLE DB
blok parametru powiązania 2
  kontynuacja polecenia OLE DB
blok parametrów powiązania 3
...

Blok parametrów powiązania jest definiowany w następujący sposób:

(bindtypeszVar1 [,szVar2 [,nVar3 [, ...]]] )

gdzie:

  • ( oznacza początek bloku powiązania danych.

  • bindtype jest jednym z następujących ciągów bez uwzględniania wielkości liter:

    • [db_column] wiąże poszczególne zmienne składowe z kolumną w zestawie wierszy.

    • [bindto] (taki sam jak [db_column]).

    • [in] wiąże zmienne składowe jako parametry wejściowe.

    • [out] wiąże zmienne składowe jako parametry wyjściowe.

    • [in,out] wiąże zmienne składowe jako parametry wejściowe/wyjściowe.

  • szVarN, nVarN rozpoznawać zmienne składowe w bieżącym zakresie.

  • ) oznacza koniec bloku powiązania danych.

Jeśli ciąg polecenia zawiera co najmniej jeden specyfikator, taki jak [in], [out]lub [in/out], db_command tworzy mapę parametrów.

Jeśli ciąg polecenia zawiera co najmniej jeden parametr, taki jak lub [bindto], db_command generuje zarówno zestaw wierszy, jak [db_column] i mapę dostępu do obsługi tych zmiennych powiązanych. Aby uzyskać więcej informacji, zobacz db_accessor.

Uwaga

bindtype składnia i bindings parametr są nieprawidłowe podczas używania db_command na poziomie klasy.

Oto kilka przykładów bloków parametrów powiązania. Poniższy przykład wiąże m_au_fname odpowiednio elementy członkowskie danych i m_au_lname z au_fname kolumnami i au_lname tabeli autorów w pubs bazie danych:

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
(Opcjonalnie) Nazwa uchwytu używanego do pracy z zestawem wierszy. Jeśli określisz nameparametr , db_command generuje klasę z określoną wartością name, która może służyć do przechodzenia przez zestaw wierszy lub wykonywania wielu zapytań akcji. Jeśli nie określisz namewartości , nie będzie można zwrócić użytkownikowi więcej niż jednego wiersza wyników.

source_name
(Opcjonalnie) Zmienna CSession lub wystąpienie klasy, która ma db_source zastosowany atrybut, na którym jest wykonywane polecenie. Zobacz: .

db_command sprawdza, czy zmienna używana dla source_name parametru jest prawidłowa, więc określona zmienna powinna znajdować się w zakresie funkcji lub globalnym.

hresult
(Opcjonalnie) Identyfikuje zmienną, która otrzyma hrESULT tego polecenia bazy danych. Jeśli zmienna nie istnieje, zostanie automatycznie wstrzyknięta przez atrybut .

bindings
(Opcjonalnie) Umożliwia oddzielenie parametrów powiązania od polecenia OLE DB.

Jeśli określisz wartość parametru bindings, db_command analizuje skojarzona wartość i nie analizuje parametru bindtype . To użycie umożliwia użycie składni dostawcy OLE DB. Aby wyłączyć analizowanie bez parametrów powiązania, określ Bindings=""wartość .

Jeśli nie określisz wartości dla bindingsparametru , db_command analizuje blok parametrów powiązania. Szuka( "", a następnie bindtype w nawiasach kwadratowych, po których następuje co najmniej jedna zadeklarowana wcześniej zmienna składowa języka C++, po której następuje ciąg ")". Usuwa cały tekst między nawiasami z wynikowego polecenia. Te parametry służą do konstruowania powiązań kolumn i parametrów dla tego polecenia.

bulk_fetch
(Opcjonalnie) Wartość całkowita określająca liczbę wierszy do pobrania.

Wartość domyślna to 1, która określa pobieranie pojedynczego wiersza (zestaw wierszy będzie mieć typ CRowset).

Wartość większa niż 1 określa pobieranie wierszy zbiorczych. Zbiorcze pobieranie wierszy odnosi się do możliwości pobierania wielu dojść wierszy zbiorczych (zestaw wierszy będzie CBulkRowset typu i wywoła SetRows z określoną liczbą wierszy).

Jeśli bulk_fetch wartość jest mniejsza niż jedna, SetRows zwróci zero.

Uwagi

db_commandCCommand tworzy obiekt, który jest używany przez użytkownika OLE DB do wykonania polecenia.

Można użyć z db_command zakresem klasy lub funkcji. Główną różnicą jest zakres CCommand obiektu. W przypadku zakresu funkcji dane, takie jak powiązania, kończą się na końcu funkcji. Zarówno użycie klas, jak i zakresu funkcji obejmuje klasę CCommand<>szablonu użytkownika OLE DB, ale argumenty szablonu różnią się w przypadku przypadków funkcji i klas. W przypadku funkcji powiązania zostaną wykonane do zmiennej Accessor lokalnej, podczas gdy użycie klasy będzie wnioskować klasę pochodną CAccessorjako argument. Gdy jest używany jako atrybut klasy, db_command współpracuje z elementem db_column.

db_command może służyć do wykonywania poleceń, które nie zwracają zestawu wyników.

Gdy dostawca atrybutów konsumenta stosuje ten atrybut do klasy, kompilator zmienia nazwę klasy na _[YourClassName]Accessor, gdzie [YourClassName] jest nazwą nadaną klasie. Kompilator tworzy również klasę o nazwie [YourClassName], która pochodzi z _[YourClassName]Accessorklasy . W widoku klasy zobaczysz obie klasy.

Przykłady

W tym przykładzie zdefiniowano polecenie, które wybiera imię i nazwisko z tabeli, w której kolumna stanu jest zgodna z adresem "CA". db_commandTworzy i odczytuje zestaw wierszy, na którym można wywoływać funkcje generowane przez kreatora, takie jak i CloseAll, oraz funkcje składowe, takie jakOpenAllMoveNext .CRowset

Ten kod wymaga podania własnych parametrów połączenia, które łączą się z bazą pubs danych. Aby uzyskać informacje na temat udostępniania parametrów połączenia w środowisku projektowym, zobacz Instrukcje: nawiązywanie połączenia z bazą danych i przeglądanie istniejących obiektów orazDodawanie nowych połączeń.

Plik db_command.hźródłowy:

// 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);
   }
};

Plik db_command.cppźródłowy:

// 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();
}

W tym przykładzie użyto db_source klasy CMySourceźródła danych i db_command klas CCommand1 poleceń i 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();
}

Wymagania

Kontekst atrybutu Wartość
Dotyczy class, structelement członkowski, metoda, local
Powtarzalność Nie
Wymagane atrybuty Brak
Nieprawidłowe atrybuty Brak

Aby uzyskać więcej informacji na temat kontekstów atrybutów, zobacz Konteksty atrybutów.

Zobacz też

Atrybuty konsumentów OLE DB
Oddzielne atrybuty