Freigeben über


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 namegeneriert, 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 bindingsdb_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 CAccessorabgeleitete 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]Accessorein , 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 CMySourceangewendet 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, structMember, Methode, lokal
Wiederholbar No
Erforderliche Attribute Keine
Ungültige Attribute Keine

Weitere Informationen zu den Attributkontexten finden Sie unter Attributkontexte.

Siehe auch

OLE DB-Consumerattribute
Eigenständige Attribute