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 parametru powiązania 1
Polecenie OLE DB
blok parametru powiązania 2
kontynuacja polecenia OLE DB
blok parametru powiązania 3
...
Blok parametrów powiązania jest definiowany w następujący sposób:
(
bindtype
szVar1 [,
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]
Tworzy powiązanie każdej ze zmiennych składowych z kolumną w zestawie wierszy.[bindto]
(takie same 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 członkowskie 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 powiązanych zmiennych. Aby uzyskać więcej informacji, zobacz db_accessor
.
Uwaga
bindtype
składnia bindings
i parametr są nieprawidłowe w przypadku używania db_command
na poziomie klasy.
Oto kilka przykładów bloków parametrów powiązania. W poniższym przykładzie elementy członkowskie danych i są powiązane m_au_fname
odpowiednio z au_fname
kolumnami i au_lname
tabeli autorzy w pubs
bazie m_au_lname
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 name
wartość , db_command
generuje klasę z określonym name
elementem , która może służyć do przechodzenia przez zestaw wierszy lub wykonywania wielu zapytań akcji. Jeśli nie określisz name
parametru , 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_source
.
db_command
sprawdza, czy zmienna używana dla source_name
elementu jest prawidłowa, więc określona zmienna powinna być w zakresie funkcji lub globalnym.
hresult
(Opcjonalnie) Identyfikuje zmienną, która otrzyma hrESULT tego polecenia bazy danych. Jeśli zmienna nie istnieje, zostanie ona 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 wartość Bindings=""
.
Jeśli nie określisz wartości parametru bindings
, db_command
analizuje blok parametrów powiązania. Szuka(
"", a następnie bindtype
nawiasów kwadratowych, po którym następuje co najmniej jedna wcześniej zadeklarowana zmienna składowa języka C++, a następnie ")
". 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 będzie wywoływany SetRows
z określoną liczbą wierszy).
Jeśli bulk_fetch
wartość jest mniejsza niż jedna, SetRows
funkcja zwróci zero.
Uwagi
db_command
tworzy CCommand
obiekt, który jest używany przez użytkownika OLE DB do wykonania polecenia.
Można użyć db_command
z 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ą wprowadzone do zmiennej Accessor
lokalnej, a użycie klasy wywnioskuje klasę pochodną CAccessor
jako 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 klasy _[YourClassName]Accessor
. 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 "CA". db_command
Tworzy i odczytuje zestaw wierszy, na którym można wywoływać funkcje generowane przez kreatora, takie jak OpenAll
i CloseAll
, oraz CRowset
funkcje składowe, takie jak MoveNext
.
Ten kod wymaga podania własnych parametry połączenia łączących się z bazą pubs
danych. Aby uzyskać informacje na temat udostępniania parametry połączenia w środowisku deweloperów, zobacz Jak: nawiązywanie połączenia z bazą danych i przeglądanie istniejących obiektów oraz Dodawanie 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 oraz 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 , struct element członkowski, metoda, lokalna |
Powtarzalne | Nie. |
Wymagane atrybuty | Brak |
Nieprawidłowe atrybuty | Brak |
Aby uzyskać więcej informacji na temat kontekstów atrybutów, zobacz Konteksty atrybutów.