Freigeben über


Ausführen von Befehlen mit Table-Valued Parametern

Das Ausführen eines Befehls, der Tabellenwertparameter enthält, erfordert zwei Phasen:

  1. Geben Sie die Parametertypen an.

  2. Binden Sie die Parameterdaten.

Table-Valued Parameterspezifikation

Der Consumer kann den Typ des Tabellenwertparameters angeben. Diese Informationen enthalten den Namen des Tabellenwertparametertyps. Sie enthält auch den Schemanamen, wenn der benutzerdefinierte Tabellentyp für den Parameter mit Tabellenwert nicht im aktuellen Standardschema für die Verbindung enthalten ist. Je nach Serverunterstützung kann der Consumer auch optionale Metadateninformationen angeben, z. B. die Sortierung von Spalten, und kann angeben, dass alle Zeilen für bestimmte Spalten die Standardwerte aufweisen.

Um einen Tabellenwertparameter anzugeben, ruft der Consumer ISSCommandWithParameter::SetParameterInfo auf und ruft optional ISSCommandWithParameters::SetParameterProperties auf. Für einen Tabellenwertparameter weist das PwszDataSourceType-Feld in der DBPARAMBINDINFO-Struktur einen Wert von DBTYPE_TABLE auf. Das Feld "ulParamSize " ist auf "~0" festgelegt, um anzugeben, dass die Länge unbekannt ist. Bestimmte Eigenschaften für Tabellenwertparameter, z. B. Schemaname, Typname, Spaltenreihenfolge und Standardspalten, können über ISSCommandWithParameters::SetParameterProperties festgelegt werden.

Table-Valued Parameterbindung

Ein Tabellenwertparameter kann ein beliebiges Rowset-Objekt sein. Der Anbieter liest dieses Objekt beim Senden von Tabellenwertparametern während der Ausführung an den Server.

Um den Parameter mit Tabellenwert zu binden, ruft der Consumer IAccessor::CreateAccessor auf. Das wType-Feld der DBBINDING-Struktur für den Parameter mit Tabellenwert wird auf DBTYPE_TABLE festgelegt. Das pObject-Element der DBBINDING-Struktur ist nicht NULL, und das iid-Element des pObjects wird auf IID_IRowset oder andere Zeilensatzobjektschnittstellen mit Tabellenwert festgelegt. Die verbleibenden Felder in der DBBINDING-Struktur sollten auf die gleiche Weise festgelegt werden, wie sie für gestreamte BLOBs festgelegt werden.

In den Bindungen für den Parameter "table-valued" und dem rowset-Objekt, das einem Parameter mit Tabellenwert zugeordnet ist, gelten die folgenden Einschränkungen:

  • Die einzigen Statuswerte, die für Zeilenzeilendaten mit Tabellenwerten zulässig sind, sind DBSTATUS_S_ISNULL und DBSTATUS_S_OK. DBSTATUS_S_DEFAULT führt zu einem Fehler, und der gebundene Statuswert wird auf DBSTATUS_E_BADSTATUS festgelegt.

  • Ein Tabellenwertparameter kann mit dem Status DBSTATUS_S_DEFAULT gekennzeichnet werden. Die einzigen gültigen Werte sind DBSTATUS_S_DEFAULT und DBSTATUS_S_OK. Wenn der Status auf DBSTATUS_S_DEFAULT festgelegt ist, entspricht der Wert des Tabellenwertparameters einer leeren Tabelle.

  • Schreibgeschützte Spalten in Tabellenwertparametern (Identitäts- oder berechnete Spalten) müssen mithilfe der SSPROP_PARAM_TABLE_DEFAULT_COLUMNS-Eigenschaft als Standard gekennzeichnet werden. Spalten mit einem Standardwert müssen auch als Standard über SSPROP_PARAM_TABLE_DEFAULT_COLUMNS Eigenschaft gekennzeichnet werden, damit der Standardwert für die Datenwerte der Spalte für einen bestimmten Tabellenwertparameter verwendet werden kann. Der Anbieter ignoriert die Datenwerte, die für die als Standard gekennzeichneten Spalten gebunden sind.

  • Daten werden für Spalten mit DBPROP_COL_AUTOINCREMENT oder SSPROP_COL_COMPUTED an den Server gesendet, es sei denn, SSPROP_PARAM_TABLE_DEFAULT ist ebenfalls festgelegt.

Siehe auch

Table-Valued-Parameter (OLE DB)
Verwenden von Table-Valued-Parametern (OLE DB)