Schemaabschnitt

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 variable Längenzeichenfolgen, da keine Typinformationen im Schema enthalten sind.

Erstellen von Aliasnamen für Spaltennamen

Mit dem Attribut rs:name können Sie einen Alias für einen Spaltennamen anlegen, so dass ein freundlicher Name in den Spalteninformationen des Rowsets erscheinen kann und ein kürzerer Name im Datenbereich verwendet werden kann. Das vorherige Schema könnte zum Beispiel wie folgt geändert werden, um ShipperID auf s1, CompanyName auf s2 und Phone auf s3 abzubilden:

<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>  

Dann würde die Zeile im Datenabschnitt das Attribut name (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 immer dann erforderlich, wenn ein Spaltenname kein gültiger Attribut- oder Tagname in XML ist. Zum Beispiel muss „LastName“ einen Alias haben, da Namen mit eingebetteten Leerzeichen ungültige Attribute sind. Die folgende Zeile wird vom XML-Parser nicht korrekt verarbeitet, so dass Sie einen Alias für einen anderen Namen erstellen müssen, der kein eingebettetes Leerzeichen enthält.

<row last name="Jones"/>  

Unabhängig davon, welchen Wert Sie für das Attribut name verwenden, muss die Spalte an jeder Stelle, an der auf sie verwiesen wird, sowohl im Schema- als auch im Datenabschnitt des XML-Dokuments konsistent verwendet werden. Das folgende Beispiel zeigt die konsequente 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 einheitlich verwendet werden.

Datentypen

Sie können einen Datentyp auf eine Spalte mit dem dt:type-Attribut anwenden. Informationen zum endgültigen Leitfaden 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. Beispiel:

<s:AttributeType name="Phone" >  
  <s:datatype dt:type="string"/>  
</s:AttributeType>  

für die folgende Syntax:

<s:AttributeType name="Phone" dt:type="string"/>  

Wenn Sie das dt:type-Attribut vollständig aus der Zeilendefinition auslassen, ist der Typ der Spalte standardmäßig eine Zeichenfolge mit variabler Länge.

Wenn Sie mehr Typinformationen als einfach den Typnamen haben (z. B. dt:maxLength), ist es besser lesbar, das untergeordnete s:datatype-Element zu verwenden. Dies ist jedoch lediglich eine Konvention und keine Anforderung.

In den folgenden Beispielen wird gezeigt, 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“ festgelegt ist, 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 ist, nicht 6. Eine ausführlichere Beschreibung der FixedLength-Eigenschaft finden Sie im OLE DB-Programmierhandbuch.

Behandeln von Nullen

Nullwerte werden mit dem Attribut rs:maybenull behandelt. Ist dieses Attribut auf „true“ gesetzt, kann der Inhalt der Spalte einen Nullwert enthalten. Wird die Spalte außerdem nicht in einer Datenzeile gefunden, erhält der Benutzer, der die Daten aus dem Rowset zurückliest, von IRowset::GetData() den Status Null. Betrachten Sie die folgenden Spaltendefinitionen aus der Tabelle „Shippers“.

<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 erlaubt es, dass CompanyName Null sein kann, aber ShipperID kann keinen Nullwert enthalten. Würde der Datenbereich die folgende Zeile enthalten, würde der Persistenzanbieter den Status der Daten für die Spalte CompanyName auf die OLE DB-Statuskonstante DBSTATUS_S_ISNULL setzen:

<z:row ShipperID="1"/>  

Wäre die Zeile völlig leer, wie im Folgenden beschrieben, würde der Persistence Provider 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 vorherige Zeile gibt der Per persistenzanbieter einen OLE DB-Status von DBSTATUS_S_OK für beide Spalten zurück. In CompanyName diesem Fall ist einfach "" (eine Zeichenfolge mit null Länge).

Weitere Informationen zu den OLE DB-Konstrukten, die für die Verwendung im Schema eines XML-Dokuments für OLE DB verfügbar sind, finden Sie in der Definition von "urn:schemas-microsoft-com:rowset" und dem LEITFADEN für OLE DB-Programmer.

Weitere Informationen

Beibehalten von Datensätzen im XML-Format