Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der Schemaabschnitt ist erforderlich. Wie im vorherigen Beispiel gezeigt, schreibt ADO detaillierte Metadaten zu jeder Spalte aus, um die Semantik der Datenwerte so weit wie möglich für die Aktualisierung beizubehalten. Um jedoch im XML-Code zu laden, erfordert ADO nur die Namen der Spalten und des Rowsets, zu dem sie gehören. Hier ist ein Beispiel für ein minimales Schema:
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly">
<s:AttributeType name="ShipperID"/>
<s:AttributeType name="CompanyName"/>
<s:AttributeType name="Phone"/>
<s:Extends type="rs:rowbase"/>
</s:ElementType>
</s:Schema>
<rs:data>
...
</rs:data>
</xml>
Im vorherigen Beispiel behandelt ADO die Daten als Zeichenfolgen mit variabler Länge, da keine Typinformationen im Schema enthalten sind.
Erstellen von Aliasen für Spaltennamen
Mit dem rs:name-Attribut können Sie einen Alias für einen Spaltennamen erstellen, sodass ein Anzeigename in den vom Rowset bereitgestellten Spalteninformationen erscheint und ein kürzerer Name im Datenabschnitt genutzt wird. Beispielsweise könnte das vorherige Schema so geändert werden, dass "ShipperID" zu "s1", "CompanyName" zu "s2" und "Phone" wie folgt zugeordnet würde:
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly" rs:updatable="true">
<s:AttributeType name="s1" rs:name="ShipperID" rs:number="1" ...>
...
</s:AttributeType>
<s:AttributeType name="s2" rs:name="CompanyName" rs:number="2" ...>
...
</s:AttributeType>
<s:AttributeType name="s3" rs:name="Phone" rs:number="3" ...>
...
</s:AttributeType>
...
</s:ElementType>
</s:Schema>
Anschließend würde die Zeile im Datenabschnitt das Namensattribute (nicht rs:name) verwenden, um auf diese Spalte zu verweisen:
"<row s1="1" s2="Speedy Express" s3="(503) 555-9831"/>
Das Erstellen von Aliasen für Spaltennamen ist erforderlich, wenn ein Spaltenname kein gültiges Attribut oder tagname in XML ist. Beispielsweise muss "LastName" einen Alias aufweisen, da Namen mit eingebetteten Leerzeichen ungültige Attribute sind. Die folgende Zeile wird vom XML-Parser nicht ordnungsgemäß behandelt. Daher müssen Sie einen Alias für einen anderen Namen erstellen, der kein eingebettetes Leerzeichen aufweist.
<row last name="Jones"/>
Jeder Wert, den Sie für das Name-Attribut verwenden, muss an jeder Stelle konsistent sein, an der im Schema- und den Datenabschnitten des XML-Dokuments darauf verwiesen wird. Das folgende Beispiel zeigt die konsistente Verwendung von s1:
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly">
<s:attribute type="s1"/>
<s:attribute type="CompanyName"/>
<s:attribute type="s3"/>
<s:extends type="rs:rowbase"/>
</s:ElementType>
<s:AttributeType name="s1" rs:name="ShipperID" rs:number="1"
rs:maydefer="true" rs:writeunknown="true">
<s:datatype dt:type="i4" dt:maxLength="4" rs:precision="10"
rs:fixedlength="true" rs:maybenull="true"/>
</s:AttributeType>
</s:Schema>
<rs:data>
<z:row s1="1" CompanyName="Speedy Express" s3="(503) 555-9831"/>
</rs:data>
Da im vorherigen Beispiel kein Alias für CompanyName definiert ist, muss CompanyName im gesamten Dokument konsistent verwendet werden.
Datentypen
Sie können einen Datentyp auf eine Spalte mit dem dt:type-Attribut anwenden. Die endgültige Anleitung zu zulässigen XML-Typen finden Sie im Abschnitt "Datentypen" der W3C-XML-Data Spezifikation. Sie können einen Datentyp auf zwei Arten angeben: geben Sie entweder das dt:type-Attribut direkt in der Spaltendefinition selbst an, oder verwenden Sie das s:datatype-Konstrukt als geschachteltes Element der Spaltendefinition. Zum Beispiel
<s:AttributeType name="Phone" >
<s:datatype dt:type="string"/>
</s:AttributeType>
ist gleichbedeutend mit
<s:AttributeType name="Phone" dt:type="string"/>
Wenn Sie das dt:type-Attribut vollständig aus der Zeilendefinition weglassen, ist der Spaltentyp standardmäßig eine Zeichenfolge mit variabler Länge.
Wenn Sie mehr Typinformationen als nur den Typnamen haben (z. B. dt:maxLength), ist es besser lesbar, das untergeordnete Element "s:datatype" zu verwenden. Dies ist jedoch lediglich eine Konvention und keine Voraussetzung.
Die folgenden Beispiele zeigen, wie Sie Typinformationen in Ihr Schema einschließen.
<!-- 1. String with no max length -->
<s:AttributeType name="title_id"/>
<!-or -->
<s:AttributeType name="title_id" dt:type="string"/>
<!-- 2. Fixed length string with max length of 6 -->
<s:AttributeType name="title_id">
<s:datatype dt:type="string" dt:maxLength="6" rs:fixedlength="true" />
</s:AttributeType>
<!-- 3. Variable length string with max length of 6 -->
<s:AttributeType name="title_id">
<s:datatype dt:type="string" dt:maxLength="6" />
</s:AttributeType>
<!-- 4. Integer -->
<s:AttributeType name="title_id" dt:type="int"/>
Es gibt eine subtile Verwendung des rs:fixedlength-Attributs im zweiten Beispiel. Eine Spalte mit dem "rs:fixedlength"-Attribut auf "true" bedeutet, dass die Daten die im Schema definierte Länge aufweisen müssen. In diesem Fall ist ein gültiger Wert für title_id "123456", wie "123" lautet. "123" wäre jedoch ungültig, da die Länge 3 und nicht 6 ist. Eine ausführlichere Beschreibung der FixedLength-Eigenschaft finden Sie im OLE DB-Programmierhandbuch.
Umgang mit Nullwerten
Nullwerte werden vom rs:maybenull-Attribut behandelt. Wenn dieses Attribut auf "true" festgelegt ist, kann der Inhalt der Spalte einen NULL-Wert enthalten. Wenn die Spalte in einer Datenzeile nicht gefunden wird, erhält der Benutzer, der die Daten zurück aus dem Rowset liest, einen NULL-Status von IRowset::GetData(). Betrachten Sie die folgenden Spaltendefinitionen aus der Tabelle "Versandmaschinen".
<s:AttributeType name="ShipperID">
<s:datatype dt:type="int" dt:maxLength="4"/>
</s:AttributeType>
<s:AttributeType name="CompanyName">
<s:datatype dt:type="string" dt:maxLength="40" rs:maybenull="true"/>
</s:AttributeType>
Die Definition ermöglicht es CompanyName null zu sein, aber ShipperID darf keinen Nullwert enthalten. Wenn der Datenabschnitt die folgende Zeile enthielt, würde der Persistenzanbieter den Status der Daten für die CompanyName Spalte auf die OLE DB-Statuskonstante DBSTATUS_S_ISNULL festlegen:
<z:row ShipperID="1"/>
Wenn die Zeile wie folgt vollständig leer war, würde der Persistenzanbieter einen OLE DB-Status von DBSTATUS_E_UNAVAILABLE für ShipperID und DBSTATUS_S_ISNULL für "CompanyName" zurückgeben.
<z:row/>
Beachten Sie, dass eine leere Zeichenfolge nicht mit null identisch ist.
<z:row ShipperID="1" CompanyName=""/>
Für die vorangehende Zeile gibt der Persistenzanbieter einen OLE DB-Status von DBSTATUS_S_OK für beide Spalten zurück. Die CompanyName in diesem Fall ist einfach "" (eine Zeichenkette der Länge null).
Weitere Informationen zu den OLE DB-Konstrukten, die im Schema eines XML-Dokuments für OLE DB zur Verfügung stehen, finden Sie in der Definition von "urn:schemas-microsoft-com:rowset" und im OLE DB-Programmierhandbuch.