db_command
Erstellt einen OLE DB-Befehl.
Syntax
[ db_command(command, name, source_name, hresult, bindings, bulk_fetch) ]
Parameter
command
Eine Befehlszeichenfolge, die den Text eines OLE DB-Befehls enthält. Ein einfaches Beispiel lautet:
[ db_command ( command = "Select * from Products" ) ]
Die command
Syntax lautet wie folgt:
Bindungsparameterblock 1
OLE DB-Befehl
Bindungsparameterblock 2
Fortsetzung des OLE DB-Befehls
Bindungsparameterblock 3
...
binding parameter block ist folgendermaßen definiert:
(
bindtype
szVar1 [,
szVar2 [ nVar3 [,
,
...]]])
Dabei gilt Folgendes:
(
markiert den Anfang des Datenbindungsblocks.bindtype
ist eine der folgenden Zeichenfolgen ohne Groß-/Kleinschreibung:[db_column]
bindet jede Elementvariable an eine Spalte in einem Rowset.[bindto]
(identisch mit[db_column]
).[in]
bindet Membervariablen als Eingabeparameter.[out]
bindet Membervariablen als Ausgabeparameter.[in,out]
bindet Membervariablen als Eingabe-/Ausgabeparameter.
szVarN, nVarN auflösen in Membervariablen innerhalb des aktuellen Bereichs.
)
markiert das Ende des Datenbindungsblocks.
Wenn die Befehlszeichenfolge einen oder mehrere Bezeichner enthält, z [in]
. B. , [out]
oder [in/out]
, db_command
erstellt eine Parameterzuordnung.
Wenn die Befehlszeichenfolge einen oder mehrere Parameter enthält, z [db_column]
. B. oder [bindto]
, db_command
generiert dann sowohl ein Rowset als auch eine Accessorzuordnung zum Dienst dieser gebundenen Variablen. Weitere Informationen finden Sie unter db_accessor
.
Hinweis
bindtype
Die Syntax und der bindings
Parameter sind bei Verwendung db_command
auf Klassenebene ungültig.
Nachfolgend finden Sie einige Beispiele für „binding parameter block“. Im folgenden Beispiel werden die m_au_fname
Elemente der Autoren bzw au_lname
m_au_lname
au_fname
. der Spalten der Autorentabelle in der pubs
Datenbank gebunden:
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
(Optional) Der Name des Handles, das Sie für die Arbeit mit dem Rowset verwenden. Wenn Sie angeben name
, db_command
wird eine Klasse mit dem angegebenen name
generiert, die zum Durchlaufen des Rowsets oder zum Ausführen mehrerer Aktionsabfragen verwendet werden kann. Wenn Sie nicht angeben name
, ist es nicht möglich, mehrere Ergebniszeilen an den Benutzer zurückzugeben.
source_name
(Optional) Die CSession
Variable oder Instanz einer Klasse, auf die das db_source
Attribut angewendet wurde, auf das der Befehl ausgeführt wird. Siehe db_source
.
db_command
überprüft, ob die variable source_name
gültig ist, sodass sich die angegebene Variable im Funktions- oder globalen Bereich befinden sollte.
hresult
(Optional) Gibt die Variable an, die das HRESULT dieses Datenbankbefehls empfängt. Wenn die Variable nicht vorhanden ist, wird sie automatisch vom Attribut eingefügt.
bindings
(Optional) Ermöglicht es Ihnen, die Bindungsparameter vom OLE DB-Befehl zu trennen.
Wenn Sie einen Wert für bindings
db_command
, analysiert den zugeordneten Wert und analysiert nicht den bindtype
Parameter. Dies ermöglicht Ihnen die Verwendung der OLE DB-Anbietersyntax. Um die Analyse ohne Bindungsparameter zu deaktivieren, geben Sie an Bindings=""
.
Wenn Sie keinen Wert für bindings
, db_command
analysiert den Bindungsparameterblock. Es sucht nach '(
', gefolgt von einer bindtype
in eckigen Klammern, gefolgt von einer oder mehreren zuvor deklarierten C++-Membervariablen, gefolgt von ')
'. Er entfernt den gesamten Text zwischen den Klammern aus dem resultierenden Befehl. Diese Parameter werden verwendet, um Spalten- und Parameterbindungen für diesen Befehl zu erstellen.
bulk_fetch
(Optional) Ein ganzzahliger Wert, der die Anzahl der abzurufenden Zeilen angibt.
Der Standardwert ist 1, der das Abrufen einzelner Zeilen angibt (das Rowset ist vom Typ CRowset
).
Ein höherer Wert als 1 gibt das Massenabrufen von Zeilen an. Massenzeilenabruf bezieht sich auf die Möglichkeit von Massen-Rowsets, mehrere Zeilenziehpunkte abzurufen (das Rowset ist vom Typ CBulkRowset
und ruft SetRows
mit der angegebenen Anzahl von Zeilen auf).
Ist bulk_fetch
dieser Wert kleiner als ein Wert, SetRows
wird null zurückgegeben.
Hinweise
db_command
erstellt ein CCommand
Objekt, das von einem OLE DB-Consumer zum Ausführen eines Befehls verwendet wird.
Sie können entweder mit Klassen- oder Funktionsbereich verwenden db_command
. Der Hauptunterschied ist der Bereich des CCommand
Objekts. Ist der Gültigkeitsbereich auf die Funktion beschränkt, werden Daten wie z.B. Bindungen bei Beendigung der Funktion ebenfalls beendet. Sowohl Klassen- als auch Funktionsbereichsverwendungen umfassen die OLE DB Consumer Template-Klasse CCommand<>
, aber die Vorlagenargumente unterscheiden sich für die Funktions- und Klassenfälle. In dem Funktionsfall werden Bindungen an ein Accessor
, das lokale Variablen umfasst, während die Klassenverwendung eine CAccessor
abgeleitete Klasse als Argument ableiten wird. Wenn sie als Klassenattribute verwendet wird, db_command
funktioniert sie zusammen mit db_column
.
db_command
kann zum Ausführen von Befehlen verwendet werden, die kein Resultset zurückgeben.
Wenn der Consumer-Attributanbieter dieses Attribut auf eine Klasse anwendet, benennt der Compiler die Klasse in _[YourClassName]Accessor
ein , wobei [YourClassName]
der Name der Klasse angegeben ist. Der Compiler erstellt auch eine Klasse namens [YourClassName]
, die von _[YourClassName]Accessor
. In der Klassenansicht werden beide Klassen angezeigt.
Beispiele
In diesem Beispiel wird ein Befehl definiert, der die Vor- und Nachnamen aus einer Tabelle auswählt, in der die Statusspalte „CA“ entspricht. db_command
erstellt und liest ein Rowset, in dem Sie vom Assistenten generierte Funktionen wie OpenAll
und CloseAll
, sowie CRowset
Memberfunktionen wie z MoveNext
. B. aufrufen können.
Dieser Code erfordert, dass Sie ihre eigene Verbindungszeichenfolge bereitstellen, die eine Verbindung mit der pubs
Datenbank herstellt. Informationen zum Bereitstellen einer Verbindungszeichenfolge in der Entwicklungsumgebung finden Sie unter How to: Connect to a database and browse existing objects and Add new connections.
Quelldatei 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);
}
};
Quelldatei 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();
}
In diesem Beispiel wird db_source
auf die Datenquellenklasse CMySource
angewendet und db_command
auf die Befehlsklassen CCommand1
und 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();
}
Anforderungen
Attributkontext | Wert |
---|---|
Gilt für | class , struct Member, Methode, lokal |
Wiederholbar | No |
Erforderliche Attribute | Keine |
Ungültige Attribute | Keine |
Weitere Informationen zu den Attributkontexten finden Sie unter Attributkontexte.