Verwenden von XML-Datentypen in SQL Server nativen Clients

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Wichtig

Der SQL Server Native Client (häufig abgekürzt mit SNAC) wurde aus SQL Server 2022 (16.x) und SQL Server Management Studio 19 (SSMS) entfernt. Der SQL Server Native Client (SQLNCLI oder SQLNCLI11) und der Microsoft OLE DB-Legacyanbieter für SQL Server (SQLOLEDB) werden für neue Anwendungsentwicklungen nicht empfohlen. Verwenden Sie in Zukunft den neuen Microsoft OLE DB-Treiber für SQL Server (MSOLEDBSQL) oder den neuesten Microsoft ODBC Driver for SQL Server. Informationen zu SQLNCLI, die als Komponente der SQL Server-Datenbank-Engine (Versionen 2012 bis 2019) enthalten ist, finden Sie in dieser Supportlebenszyklus-Ausnahme.

In SQL Server 2005 (9.x) wurde ein XML-Datentyp eingeführt, der das Speichern von XML-Dokumenten und -Fragmenten in einer SQL Server-Datenbank unterstützt. Der XML-Datentyp ist ein integrierter Datentyp in SQL Server und ähnelt in einigen Punkten anderen integrierten Typen wie int und varchar. Wie andere integrierte Typen können Sie den XML-Datentyp beim Erstellen von Tabellen als Variablen-, Parameter- oder Funktionsrückgabespaltentyp oder in CAST- und CONVERT-Funktionen verwenden.

Überlegungen zur Programmierung

XML kann selbstbeschreibend sein, da optional ein XML-Header eingefügt werden kann, der die Codierung des Dokuments angibt, zum Beispiel:

<?xml version="1.0" encoding="windows-1252"?><doc/>

Der XML-Standard beschreibt, wie ein XML-Prozessor die für ein Dokument verwendete Codierung durch Überprüfen der ersten Bytes des Dokuments erkennen kann. Es ist möglich, dass die von der Anwendung festgelegte Codierung einen Konflikt mit der im Dokument angegebenen Codierung auslöst. Für Dokumente, die als gebundene Parameter übergeben werden, wird XML von SQL Server als binäre Daten behandelt, es werden also keine Konvertierungen vorgenommen, und der XML-Parser kann die im Dokument angegebene Codierung problemlos verwenden. Für XML-Daten, die als WSTR gebunden sind, muss die Anwendung jedoch sicherstellen, dass das Dokument in Unicode codiert ist. Daraufhin wird das Dokument möglicherweise in ein DOM geladen, die Codierung in Unicode geändert und das Dokument serialisiert. Wenn dies nicht gemacht wird, finden eventuell Datenkonvertierungen statt und führen zu ungültigem oder fehlerhaftem XML.

Konflikte können auch auftreten, wenn XML in Literalen angegeben wird. Folgendes ist beispielsweise ungültig:

INSERT INTO xmltable(xmlcol) VALUES('<?xml version="1.0" encoding="UTF-16"?><doc/>')

INSERT INTO xmltable(xmlcol) VALUES(N'<?xml version="1.0" encoding="UTF-8"?><doc/>')

SQL Server Native Client OLE DB-Anbieter

DBTYPE_XML ist ein neuer xml-spezifischer Datentyp im SQL Server Native Client OLE DB-Anbieter. Zusätzlich können XML-Daten über die vorhandenen OLE DB-Typen DBTYPE_BYTES, DBTYPE_WSTR, DBTYPE_BSTR, DBTYPE_XML, DBTYPE_STR, DBTYPE_VARIANT und DBTYPE_IUNKNOWN aufgerufen werden. Daten, die in Spalten des XML-Typs gespeichert sind, können aus einer Spalte in einem SQL Server Native Client OLE DB-Anbieterrowset in den folgenden Formaten abgerufen werden:

  • Textzeichenfolge

  • ISequentialStream

Hinweis

Der SQL Server Native Client OLE DB-Anbieter enthält keinen SAX-Reader, aber der ISequentialStream kann problemlos an SAX- und DOM-Objekte in MSXML übergeben werden.

ISequentialStream sollte zum Abrufen großer XML-Dokumente verwendet werden. Die für andere große Werttypen verwendeten Techniken gelten auch für XML. Weitere Informationen finden Sie im Abschnitt Verwenden von Datentypen für umfangreiche Werte.

Daten, die in XML-Spaltentypen in einem Rowset gespeichert sind, können über die bekannten Schnittstellen wie IRow::GetColumns, IRowChange::SetColumns und ICommand::Execute abgerufen, eingefügt oder aktualisiert werden. Ähnlich wie beim Abruffall kann ein Anwendungsprogramm entweder eine Textzeichenfolge oder einen ISequentialStream an den SQL Server Native Client OLE DB-Anbieter übergeben.

Hinweis

Zum Senden von XML-Daten im Zeichenfolgenformat über die ISequentialStream-Schnittstelle müssen Sie ISequentialStream durch Angabe von DBTYPE_IUNKNOWN abrufen und das Argument pObject in der Bindung auf NULL festlegen.

Wenn abgerufene XML-Daten abgeschnitten werden, weil der Consumerpuffer zu klein ist, wird die Länge möglicherweise als 0xffffffff zurückgegeben, was heißt, dass die Länge unbekannt ist. Dies ist mit der Implementierung als Datentyp, der als Datenstrom an den Client gesendet wird, ohne Längeninformationen vorab zu senden, konsistent. In einigen Fällen kann die tatsächliche Länge zurückgegeben werden, wenn der Anbieter den gesamten Wert gepuffert hat, z. B. IRowset::GetData und wo die Datenkonvertierung durchgeführt wird.

An SQL Server gesendete XML-Daten werden vom Server als Binärdaten behandelt. Dies verhindert Konvertierungen und ermöglicht es dem XML-Parser, die XML-Codierung automatisch zu erkennen. Dadurch kann ein breiteres Spektrum von XML-Dokumenten (z. B. in UTF-8 codierte Dokumente) als Eingabe für SQL Server akzeptiert werden.

Wenn die XML-Eingabe als DBTYPE_WSTR gebunden ist, muss die Anwendung sicherstellen, dass sie bereits in Unicode codiert wurde, um mögliche Beschädigungen durch Datenkonvertierung zu verhindern.

Datenbindungen und -umwandlungen

Die folgende Tabelle veranschaulicht die Bindung und erzwungene Umwandlung bei Verwendung der aufgeführten Datentypen mit dem SQL Server-Datentyp xml.

Datentyp Zu Server

XML
Zu Server

Nicht-XML
Von Server

XML
Von Server

Nicht-XML
DBTYPE_XML Pass-Through6,7 Fehler1 OK11, 6 Error8
DBTYPE_BYTES Pass-Through6,7 Nicht zutreffend2 OK11, 6 Nicht zutreffend2
DBTYPE_WSTR Pass-Through6,10 Nicht zutreffend2 OK4, 6, 12 Nicht zutreffend2
DBTYPE_BSTR Pass-Through6,10 Nicht zutreffend2 OK3 Nicht zutreffend2
DBTYPE_STR OK6, 9, 10 Nicht zutreffend2 OK5, 6, 12 Nicht zutreffend2
DBTYPE_IUNKNOWN Bytedatenstrom über ISequentialStream7 Nicht zutreffend2 Bytedatenstrom über ISequentialStream11 Nicht zutreffend2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Pass-Through6,7 Nicht zutreffend2 Nicht zutreffend2
DBTYPE_VARIANT (VT_BSTR) Pass-Through6,10 Nicht zutreffend2 OK3 Nicht zutreffend2

1Wenn ein anderer Servertyp als DBTYPE_XML mit ICommandWithParameters::SetParameterInfo angegeben wird und der Accessortyp DBTYPE_XML ist, tritt beim Ausführen der Anweisung ein Fehler auf (DB_E_ERRORSOCCURRED, der Parameterstatus ist DBSTATUS_E_BADACCESSOR). Andernfalls werden die Daten an den Server gesendet, der Server gibt jedoch einen Fehler zurück und zeigt an, dass keine implizite Konvertierung von XML in den Parameterdatentyp erfolgt.

2 Außerhalb des Bereichs dieses Themas.

3Format ist UTF-16, keine Bytereihenfolge-Marke (Byte Order Mark, BOM), keine Codierungsspezifikation, keine NULL-Terminierung.

4Format ist UTF-16, keine BOM, keine Codierungsspezifikation, NULL-Terminierung.

5Format enthält Mehrbytezeichen, die auf der Clientcodepage mit NULL-Abschlusszeichen codiert sind. Konvertierung aus vom Server bereitgestelltem Unicode verursacht möglicherweise Datenbeschädigung, daher wird diese Bindung nicht empfohlen.

6BY_REF wird möglicherweise verwendet.

7UTF-16-Daten müssen mit einer BOM starten. Wenn nicht, wird die Codierung möglicherweise nicht ordnungsgemäß vom Server erkannt.

8Überprüfung kann beim Erstellen des Accessors oder beim Abrufen erfolgen. Der Fehler ist DB_E_ERRORSOCCURRED, Bindungsstatus ist auf DBBINDSTATUS_UNSUPPORTEDCONVERSION festgelegt.

9Daten werden über die Clientcodepage in Unicode konvertiert, bevor sie an den Server gesendet werden. Falls die Dokumentcodierung nicht mit der Clientcodepage übereinstimmt, kann es zu Datenbeschädigungen kommen, daher wird diese Bindung nicht empfohlen.

10Zum Server gesendeten Daten wird immer eine BOM hinzugefügt. Falls die Daten bereits mit einer BOM begonnen haben, stehen dann zwei BOMs am Beginn des Puffers. Der Server verwendet die erste BOM, um die Codierung als UTF-16 zu erkennen, und verwirft sie dann. Die zweite BOM wird als geschütztes Leerzeichenzeichen mit Nullbreite interpretiert.

11Format ist UTF-16, keine Codierungsspezifikation, zu den vom Server empfangenen Daten wird eine BOM hinzugefügt. Wenn eine leere Zeichenfolge vom Server zurückgegeben wird, wird trotzdem eine BOM an die Anwendung zurückgegeben. Wenn die Pufferlänge eine ungerade Anzahl von Bytes ist, werden die Daten ordnungsgemäß abgeschnitten. Wenn der ganze Wert in Abschnitten zurückgegeben wird, können diese verkettet werden, um wieder den richtigen Wert zusammenzusetzen.

12 Wenn die Pufferlänge kleiner als zwei Zeichen ist, d. h. nicht genügend Speicherplatz für null-Beendigung, wird ein Überlauffehler gemeldet.

Hinweis

Es werden keine Daten für NULL XML-Werte zurückgegeben.

Der XML-Standard erfordert, dass UTF-16-codiertes XML mit einer Bytereihenfolge-Marke (BOM), UTF-16-Zeichencode 0xFEFF beginnt. Beim Arbeiten mit WSTR- und BSTR-Bindungen erfordert SQL Server Native Client keine BoM, da die Codierung von der Bindung impliziert wird. Bei der Verwendung von BYTES-, XML- oder IUNKNOWN-Bindungen liegt das Hauptaugenmerk auf der einfachen Zusammenarbeit mit anderen XML-Prozessoren und Speichersystemen. In diesem Fall sollte für UTF-16-codiertes XML eine BOM vorhanden sein, und die Anwendung sollte sich nicht um die eigentliche Codierung kümmern, da die Mehrheit der XML-Prozessoren (einschließlich SQL Server) die Codierung nach Überprüfen des ersten Bytes des Wertes ableitet. XML-Daten, die von SQL Server Native Client mithilfe von BYTES-, XML- oder IUNKNOWN-Bindungen empfangen werden, werden immer in UTF-16 mit einer BOM und ohne eingebettete Codierungsdeklaration codiert.

Datenkonvertierungen durch OLE DB-Basisdienste (IDataConvert) sind nicht auf DBTYPE_XML anwendbar.

Die Überprüfung erfolgt, wenn Daten an den Server gesendet werden. Die clientseitige Gültigkeitsprüfung und Codierungsänderungen sollten von Ihrer Anwendung ausgeführt werden. Es wird nachdrücklich empfohlen, die XML-Daten nicht direkt zu verarbeiten, sondern einen DOM- oder SAX-Reader zur Verarbeitung zu verwenden.

DBTYPE_NULL und DBTYPE_EMPTY können für Eingabeparameter gebunden werden, aber nicht für Ausgabeparameter oder Ergebnisse. Ist der Status für Eingabeparameter gebunden, muss er auf DBSTATUS_S_ISNULL oder DBSTATUS_S_DEFAULT festgelegt werden.

DBTYPE_XML kann in DBTYPE_EMPTY und DBTYPE_NULL konvertiert werden, DBTYPE_EMPTY in DBTYPE_XML, aber DBTYPE_NULL kann nicht in DBTYPE_XML konvertiert werden. Dies stimmt mit DBTYPE_WSTR überein.

DBTYPE_IUNKNOWN ist eine unterstützte Bindung (wie in der Tabelle oben gezeigt), aber es gibt keine Konvertierungen zwischen DBTYPE_XML und DBTYPE_IUNKNOWN. DBTYPE_IUNKNOWN kann nicht mit DBTYPE_BYREF verwendet werden.

Hinzufügungen und Änderungen am OLE DB-Rowset

SQL Server Native Client fügt vielen der wichtigsten OLE DB-Schemarowsets neue Werte oder Änderungen hinzu.

Die COLUMNS- und PROCEDURE_PARAMETERS-Schemarowsets

Den COLUMNS- und PROCEDURE_PARAMETERS-Schemarowsets wurden unter anderem die folgenden Spalten hinzugefügt.

Spaltenname type BESCHREIBUNG
SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Der Name des Katalogs, in dem eine XML-Schemaauflistung definiert ist. NULL für eine Nicht-XML-Spalte oder nicht typisierte XML-Spalte.
SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Der Name eines Schemas, in dem eine XML-Schemaauflistung definiert ist. NULL für eine Nicht-XML-Spalte oder nicht typisierte XML-Spalte.
SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Der Name der XML-Schemaauflistung. NULL für eine Nicht-XML-Spalte oder nicht typisierte XML-Spalte.

Das PROVIDER_TYPES-Schemarowset

Im PROVIDER_TYPES-Schemarowset ist der COLUMN_SIZE-Wert für den XML-Datentyp 0, und DATA_TYPE ist DBTYPE_XML.

Das SS_XMLSCHEMA-Schemarowset

Ein neues Schemarowset SS_XMLSCHEMA wird eingeführt, mit dem Clients XML-Schema-Informationen abrufen können. Das SS_XMLSCHEMA-Rowset enthält folgende Spalten.

Spaltenname type BESCHREIBUNG
SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Der Katalog, zu dem eine XML-Auflistung gehört.
SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Das Schema, zu dem eine XML-Auflistung gehört.
SCHEMACOLLECTIONNAME DBTYPE_WSTR Der Name einer XML-Schemaauflistung für typisierte XML-Spalten, andernfalls NULL.
TARGETNAMESPACEURI DBTYPE_WSTR Der Zielnamespace eines XML-Schemas.
SCHEMACONTENT DBTYPE_WSTR Der Inhalt der XML-Schemas.

Jedes XML-Schema wird nach Katalogname, Schemaname, Schemaauflistung und Zielnamespace-URI (Uniform Resource Identifier) einem Bereich zugeordnet. Außerdem wird eine neue GUID mit dem Namen DBSCHEMA_XML_COLLECTIONS definiert. Die Anzahl von Einschränkungen und eingeschränkten Spalten für das SS_XMLSCHEMA-Schemarowset wird wie folgt definiert.

GUID Anzahl der Einschränkungen Eingeschränkte Spalten
DBSCHEMA_XML_COLLECTIONS 4 SCHEMACOLLECTION_CATALOGNAME

SCHEMACOLLECTION_SCHEMANAME

SCHEMACOLLECTIONNAME

TARGETNAMESPACEURI

Hinzufügungen und Änderungen an der OLE DB-Eigenschaftengruppe

SQL Server Native Client fügt vielen ole DB-Kerneigenschaftensätzen neue Werte oder Änderungen hinzu.

Die DBPROPSET_SQLSERVERPARAMETER-Eigenschaftengruppe

Um den xml-Datentyp über OLE DB zu unterstützen, implementiert SQL Server Native Client den neuen DBPROPSET_SQLSERVERPARAMETER-Eigenschaftssatz, der die folgenden Werte enthält.

Name type BESCHREIBUNG
SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Der Name des Katalogs (Datenbank), in dem eine XML-Schemaauflistung definiert ist. Teil des dreiteiligen SQL-Namensbezeichners.
SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Der Name eines XML-Schemas in der Schemaauflistung. Teil des dreiteiligen SQL-Namensbezeichners.
SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Der Name der XML-Schemaauflistung im Katalogteil A des dreiteiligen SQL-Namensbezeichners.

Die DBPROPSET_SQLSERVERCOLUMN-Eigenschaftengruppe

Um die Erstellung von Tabellen in der ITableDefinition-Schnittstelle zu unterstützen, fügt SQL Server Native Client dem DBPROPSET_SQLSERVERCOLUMN-Eigenschaftssatz drei neue Spalten hinzu.

Name type BESCHREIBUNG
SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME VT_BSTR Bei typisierten XML-Spalten ist diese Eigenschaft eine Zeichenfolge, die den Namen des Katalogs angibt, in dem das XML-Schema gespeichert ist. Für andere Spaltentypen gibt diese Eigenschaft eine leere Zeichenfolge zurück.
SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME VT_BSTR Bei typisierten XML-Spalten ist diese Eigenschaft eine Zeichenfolge, die den Namen des XML-Schemas angibt, das diese Spalte definiert.
SSPROP_COL_XML_SCHEMACOLLECTIONNAME VT_BSTR Bei typisierten XML-Spalten ist diese Eigenschaft eine Zeichenfolge, die den Namen der XML-Schemaauflistung angibt, die den Wert definiert.

Wie die SSPROP_PARAM-Werte sind all diese Eigenschaften optional und standardmäßig leer. SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME und SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME können nur angegeben werden, wenn SSPROP_COL_XML_SCHEMACOLLECTIONNAME angegeben ist. Bei der Übergabe von XML an den Server werden diese Werte (falls vorhanden) auf ihr Vorhandensein in der aktuellen Datenbank überprüft, und die Instanzdaten werden mit dem Schema verglichen. In jedem Fall müssen sie entweder alle leer oder alle ausgefüllt sein, um gültig zu sein.

Hinzufügungen und Änderungen an der OLE DB-Schnittstelle

SQL Server Native Client fügt vielen der WICHTIGSTEN OLE DB-Schnittstellen neue Werte oder Änderungen hinzu.

Die ISSCommandWithParameters-Schnittstelle

Um den XML-Datentyp über OLE DB zu unterstützen, implementiert SQL Server Native Client eine Reihe von Änderungen, einschließlich des Hinzufügens der ISSCommandWithParameters-Schnittstelle. Diese neue Schnittstelle erbt von der OLE DB-Kernschnittstelle ICommandWithParameters. Zusätzlich zu den drei Methoden, die von ICommandWithParameters geerbt werden; GetParameterInfo, MapParameterNames und SetParameterInfo; ISSCommandWithParameters stellt die Methoden GetParameterProperties und SetParameterProperties bereit, die zum Verarbeiten serverspezifischer Datentypen verwendet werden.

Hinweis

Die ISSCommandWithParameters-Schnittstelle nutzt auch die neue SSPARAMPROPS-Struktur.

Die IDBColumnsRowset-Schnittstelle

SQL Server Native Client fügt dem von der IColumnRowset::GetColumnsRowset-Methode zurückgegebenen Rowset die folgenden SQL Server spezifischen Spalten hinzu. Diese Spalten enthalten den dreiteiligen Namen einer XML-Schemaauflistung. Für Nicht-XML-Spalten oder nicht typisierte XML-Spalten nehmen alle drei Spalten den Standardwert von NULL an.

Spaltenname type BESCHREIBUNG
DBCOLUMN_SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Der Katalog, zu dem eine XML-Schemaauflistung gehört.

Andernfalls NULL.
DBCOLUMN_SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Das Schema, zu dem eine XML-Schemaauflistung gehört. Andernfalls NULL.
DBCOLUMN_SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Der Name einer XML-Schemaauflistung für typisierte XML-Spalten, andernfalls NULL.

Die IRowset-Schnittstelle

Eine XML-Instanz in einer XML-Spalte wird über die IRowset::GetData-Methode abgerufen. Je nach Bindung, die vom Client angegeben ist, kann eine XML-Instanz als DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML, DBTYPE_STR, DBTYPE_BYTES oder als Schnittstelle über DBTYPE_IUNKNOWN abgerufen werden. Falls der Consumer DBTYPE_BSTR, DBTYPE_WSTR oder DBTYPE_VARIANT angibt, konvertiert der Anbieter die XML-Instanz in den vom Benutzer angeforderten Typ und legt ihn an dem in der zugehörigen Bindung angegebenen Speicherort ab.

Falls der Consumer DBTYPE_IUNKNOWN angibt und das pObject-Argument auf NULL oder das pObject-Argument auf IID_IsequentialStream festlegt, gibt der Anbieter eine ISequentialStream-Schnittstelle an den Consumer zurück, damit er den XML-Datenstrom aus der Spalte übertragen kann. ISequentialStream gibt die XML-Daten anschließend als Unicode-Zeichendatenstrom zurück.

Wenn ein an DBTYPE_IUNKNOWN gebundener XML-Wert zurückgegeben wird, meldet der Anbieter einen Größenwert von sizeof (IUnknown *). Dies stimmt mit der Vorgehensweise für Spalten überein, die als DBTYPE_IUnknown oder DBTYPE_IDISPATCH gebunden sind, sowie für DBTYPE_IUNKNOWN/ISequentialStream, wenn die genaue Spaltengröße nicht bestimmt werden kann.

Die IRowsetChange-Schnittstelle

Es gibt zwei Methoden, wie ein Consumer eine XML-Instanz in einer Spalte aktualisieren kann. Die erste Methode erfolgt durch das vom Anbieter erstellte Speicherobjekt ISequentialStream. Der Consumer kann die ISequentialStream::Write-Methode aufrufen, um die vom Anbieter zurückgegebene XML-Instanz direkt zu aktualisieren.

Der zweite Ansatz ist die IRowsetChange::SetData-Methode oder IRowsetChange::InsertRow-Methode. Bei dieser Vorgehensweise kann eine XML-Instanz im Consumerpuffer in einer Bindung vom Typ DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML oder DBTYPE_IUNKNOWN angegeben werden.

Im Falle von DBTYPE_BSTR, DBTYPE_WSTR oder DBTYPE_VARIANT speichert der Anbieter die XML-Instanz, die sich im Consumerpuffer befindet, in der entsprechenden Spalte.

Wenn der Consumer im Fall von DBTYPE_IUNKNOWN/ISequentialStream kein Speicherobjekt angibt, muss der Consumer im Voraus ein ISequentialStream-Objekt erstellen, das XML-Dokument an das -Objekt binden und das Objekt dann über die IRowsetChange::SetData-Methode an den Anbieter übergeben. Der Consumer kann auch ein Speicherobjekt erstellen, das pObject-Argument auf IID_ISequentialStream festlegen, ein ISequentialStream-Objekt erstellen und anschließend das ISequentialStream-Objekt an die IRowsetChange::SetData-Methode übergeben. In beiden Fällen kann der Anbieter das XML-Objekt über das ISequentialStream-Objekt abrufen und es in die entsprechende Spalte einfügen.

Die IRowsetUpdate-Schnittstelle

Die IRowsetUpdate-Schnittstelle stellt die Funktionen für verzögerte Updates bereit. Die für die Rowsets zur Verfügung gestellten Daten werden erst für andere Transaktionen verfügbar gemacht, wenn der Consumer die IRowsetUpdate:Update-Methode aufruft.

Die IRowsetFind-Schnittstelle

Die IRowsetFind::FindNextRow-Methode funktioniert nicht mit dem XML-Datentyp. Wenn IRowsetFind::FindNextRow aufgerufen wird und das hAccessor-Argument eine Spalte von DBTYPE_XML angibt, wird DB_E_BADBINDINFO zurückgegeben. Dies tritt unabhängig vom Typ der Spalte auf, die durchsucht wird. Für alle anderen Bindungstypen schlägt FindNextRow mit DB_E_BADCOMPAREOP fehl, wenn die zu durchsuchende Spalte vom Datentyp XML ist.

ODBC-Treiber für SQL Server Native Client

Im SQL Server Native Client ODBC-Treibers wurden eine Reihe von Änderungen an verschiedenen Funktionen vorgenommen, um den XML-Datentyp zu unterstützen.

SQLColAttribute

Die SQLColAttribute-Funktion verfügt über drei neue Feldbezeichner, einschließlich SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME und SQL_CA_SS _XML_SCHEMACOLLECTION_NAME.

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED für die Spalten SQL_DESC_DISPLAY_SIZE und SQL_DESC_LENGTH.

SQLColumns

Die SQLColumns-Funktion verfügt über drei neue Spalten, einschließlich SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SS_XML_SCHEMACOLLECTION_SCHEMA_NAME und SS_XML_SCHEMACOLLECTION_NAME. Die vorhandene TYPE_NAME-Spalte dient zur Angabe des Namens des XML-Typs, und DATA_TYPE für eine Spalte oder einen Parameter vom XML-Typ ist SQL_SS_XML.

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED für die COLUMN_SIZE- und CHAR_OCTET_LENGTH-Werte.

SQLDescribeCol

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED, wenn die Spaltengröße in der FUNKTION SQLDescribeCol nicht bestimmt werden kann.

SQLGetTypeInfo

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED als maximale COLUMN_SIZE für den xml-Datentyp in der FUNKTION SQLGetTypeInfo.

SQLProcedureColumns

Die SQLProcedureColumns-Funktion verfügt über die gleichen Spaltenzufügungen wie die SQLColumns-Funktion .

Der SQL Server Native Client ODBC-Treiber meldet SQL_SS_LENGTH_UNLIMITED als maximale COLUMN_SIZE für den xml-Datentyp.

Unterstützte Umwandlungen

Bei der Umwandlung von SQL- in C-Datentypen können SQL_C_WCHAR, SQL_C_BINARY und SQL_C_CHAR unter folgenden Bedingungen in SQL_SS_XML umgewandelt werden:

  • SQL_C_WCHAR: Format ist UTF-16, keine Bytereihenfolge-Marke (BOM), mit NULL-Terminierung.

  • SQL_C_BINARY: Format ist UTF-16, ohne NULL-Terminierung. Den vom Server empfangenen Daten wird immer eine BOM hinzugefügt. Wenn eine leere Zeichenfolge vom Server zurückgegeben wird, wird trotzdem eine BOM an die Anwendung zurückgegeben. Wenn die Pufferlänge eine ungerade Anzahl von Bytes ist, werden die Daten ordnungsgemäß abgeschnitten. Wenn der ganze Wert in Abschnitten zurückgegeben wird, können diese verkettet werden, um wieder den richtigen Wert zusammenzusetzen.

  • SQL_C_CHAR: Format enthält Mehrbytezeichen, die in der Clientcodepage mit NULL-Terminierung codiert sind. Konvertierung aus vom Server bereitgestelltem UTF-16 verursacht möglicherweise Datenbeschädigung, daher wird diese Bindung nicht empfohlen.

Bei der Umwandlung von C- in SQL-Datentypen können SQL_C_WCHAR, SQL_C_BINARY und SQL_C_CHAR unter folgenden Bedingungen in SQL_SS_XML umgewandelt werden:

  • SQL_C_WCHAR: Den an den Server gesendeten Daten wird immer eine BOM hinzugefügt. Falls die Daten bereits mit einer BOM begonnen haben, stehen dann zwei BOMs am Beginn des Puffers. Der Server verwendet die erste BOM, um die Codierung als UTF-16 zu erkennen, und verwirft sie dann. Die zweite BOM wird als geschütztes Leerzeichenzeichen mit Nullbreite interpretiert.

  • SQL_C_BINARY: Es wird keine Konvertierung durchgeführt, und die Daten werden an den Server übergeben. UTF-16-Daten müssen mit einer BoM beginnen. andernfalls wird die Codierung vom Server möglicherweise nicht ordnungsgemäß erkannt.

  • SQL_C_CHAR: Die Daten werden auf dem Client in UTF-16 konvertiert und als SQL_C_WCHAR an den Server gesendet (einschließlich der hinzugefügten BOM). Wenn XML nicht in der Clientcodepage codiert ist, kann dies zu Datenbeschädigungen führen.

Der XML-Standard erfordert, dass UTF-16-codiertes XML mit einer Bytereihenfolge-Marke (BOM), UTF-16-Zeichencode 0xFEFF beginnt. Beim Arbeiten mit einer SQL_C_BINARY-Bindung erfordert SQL Server Native Client keine BoM, da die Codierung von der Bindung impliziert wird. Das Hauptaugenmerk liegt auf der einfachen Zusammenarbeit mit anderen XML-Prozessoren und Speichersystemen. In diesem Fall sollte eine BoM mit UTF-16-codiertem XML vorhanden sein, und die Anwendung muss sich nicht um die tatsächliche Codierung kümmern, da die Mehrheit der XML-Prozessoren (einschließlich SQL Server) die Codierung ableiten, indem die ersten Bytes des Werts überprüft werden. XML-Daten, die von SQL Server Native Client mit SQL_C_BINARY-Bindungen empfangen werden, werden immer in UTF-16 mit einer BoM und ohne eingebettete Codierungsdeklaration codiert.

Weitere Informationen

SQL Server Native Client-Funktionen
ISSCommandWithParameters (OLE DB)