Sección de esquema
Se requiere la sección de esquema. Como se muestra en el ejemplo anterior, ADO escribe metadatos detallados sobre cada columna para conservar la semántica de los valores de datos tanto como sea posible para la actualización. Sin embargo, para cargar en el XML, ADO solo requiere los nombres de las columnas y el conjunto de filas al que pertenecen. Este es un ejemplo de un esquema mínimo:
<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>
En el ejemplo anterior, ADO tratará los datos como cadenas de longitud variable porque no se incluye información de tipo en el esquema.
Creación de alias para nombres de columna
El atributo rs:name permite crear un alias para un nombre de columna para que un nombre descriptivo aparezca en la información de columna expuesta por el conjunto de filas y se puede usar un nombre más corto en la sección de datos. Por ejemplo, el esquema anterior se podría modificar para asignar ShipperID a s1, CompanyName a s2 y Phone a s3 de la siguiente manera:
<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>
A continuación, en la sección de datos, la fila usaría el atributo name (no rs:name) para hacer referencia a esa columna:
"<row s1="1" s2="Speedy Express" s3="(503) 555-9831"/>
La creación de alias para nombres de columna es necesaria siempre que un nombre de columna no sea un atributo o un nombre de etiqueta válidos en XML. Por ejemplo, "LastName" debe tener un alias porque los nombres con espacios incrustados son atributos no válidos. El analizador XML no controlará correctamente la siguiente línea, por lo que debe crear un alias para algún otro nombre que no tenga espacio incrustado.
<row last name="Jones"/>
Cualquier valor que use para el atributo name debe usarse de forma coherente en cada lugar al que se hace referencia a la columna en las secciones de esquema y datos del documento XML. En el ejemplo siguiente se muestra el uso coherente de 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>
Del mismo modo, dado que no hay ningún alias definido para CompanyName
en el ejemplo anterior, CompanyName
se debe usar de forma coherente en todo el documento.
Tipo de datos
Puede aplicar un tipo de datos a una columna con el atributo dt:type. Para obtener la guía definitiva sobre los tipos XML permitidos, consulte la sección Tipos de datos de la especificación de XML-Data W3C. Puede especificar un tipo de datos de dos maneras: especifique el atributo dt:type directamente en la propia definición de columna o use la construcción s:datatype como un elemento anidado de la definición de columna. Por ejemplo,
<s:AttributeType name="Phone" >
<s:datatype dt:type="string"/>
</s:AttributeType>
es equivalente a
<s:AttributeType name="Phone" dt:type="string"/>
Si omite completamente el atributo dt:type de la definición de fila, de forma predeterminada, el tipo de la columna será una cadena de longitud variable.
Si tiene más información de tipo que simplemente el nombre de tipo (por ejemplo, dt:maxLength), hace que sea más legible usar el elemento secundario s:datatype. Sin embargo, esto es simplemente una convención, y no un requisito.
En los ejemplos siguientes se muestra más información sobre cómo incluir información de tipos en el esquema.
<!-- 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"/>
Hay un uso sutil del atributo rs:fixedlength en el segundo ejemplo. Una columna con el atributo rs:fixedlength establecido en true significa que los datos deben tener la longitud definida en el esquema. En este caso, un valor válido para title_id es "123456", como es "123 ". Sin embargo, "123" no sería válido porque su longitud es 3, no 6. Consulte la Guía del programador de OLE DB para obtener una descripción más completa de la propiedad fixedlength.
Control de valores NULL
El atributo rs:maybenull controla los valores NULL. Si este atributo se establece en true, el contenido de la columna puede contener un valor NULL. Además, si la columna no se encuentra en una fila de datos, el usuario que lee los datos del conjunto de filas obtendrá un estado nulo de IRowset::GetData(). Tenga en cuenta las siguientes definiciones de columna de la tabla 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>
La definición permite CompanyName
ser null, pero ShipperID
no puede contener un valor NULL. Si la sección de datos contenía la fila siguiente, el proveedor de persistencia establecería el estado de los datos de la CompanyName
columna en la constante de estado OLE DB de DBSTATUS_S_ISNULL:
<z:row ShipperID="1"/>
Si la fila estaba completamente vacía, como se indica a continuación, el proveedor de persistencia devolvería un estado OLE DB de DBSTATUS_E_UNAVAILABLE para ShipperID
y DBSTATUS_S_ISNULL para CompanyName.
<z:row/>
Tenga en cuenta que una cadena de longitud cero no es la misma que null.
<z:row ShipperID="1" CompanyName=""/>
Para la fila anterior, el proveedor de persistencia devolverá un estado OLE DB de DBSTATUS_S_OK para ambas columnas. En CompanyName
este caso, es simplemente "" (una cadena de longitud cero).
Para obtener más información sobre las construcciones OLE DB disponibles para su uso en el esquema de un documento XML para OLE DB, vea la definición de "urn:schemas-microsoft-com:rowset" y la Guía del programador de OLE DB.