Compartir a través de


Sección de esquema

Se aplica a: Access 2013, Office 2013

Sección de esquema

La sección de esquema no debe faltar. Como se muestra en el ejemplo anterior, ADO escribe metadatos detallados de cada columna para conservar la semántica de los valores de los datos lo máximo posible para las actualizaciones. Sin embargo, para la carga en XML, ADO sólo requiere los nombres de las columnas y del conjunto de filas al que pertenecen. Éste 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 caso anterior, ADO tratará los datos como cadenas de longitud variable, ya que no se incluye ninguna información de tipos en el esquema.

Crear alias para nombres de columnas

El atributo rs:name permite crear un alias para un nombre de columna, de modo que aparezca un nombre descriptivo en la información de la columna expuesta por el conjunto de filas y se pueda 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 del siguiente modo:

 
<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 utilizaría el atributo name (no rs:name) para hacer referencia a dicha columna:

 
"<row s1="1" s2="Speedy Express" s3="(503) 555-9831"/> 

La creación de alias para nombres de columnas es necesaria siempre que un nombre de columna no sea un nombre de etiqueta ni un atributo legal en XML. Por ejemplo, "Last Name" (Apellidos) debe tener un alias porque los nombres con espacios intermedios no son atributos legales. El analizador de XML no procesará correctamente la siguiente línea, por lo que debe crear un alias en algún otro nombre que no contenga espacios internos:

 
<row last name="Jones"/> 

Cualquier valor que utilice para el atributo name se debe utilizar de la misma forma en cada lugar de las secciones de esquema y de datos del documento XML donde se haga referencia a la columna. En el siguiente ejemplo, 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> 

De igual forma, puesto que no se ha definido ningún alias para CompanyName, se debe utilizar este nombre de la misma forma en todo el documento.

Tipos de datos

Puede aplicar un tipo de datos a una columna con el atributo dt:type. Puede especificar un tipo de datos de dos formas: especificando el atributo dt:type directamente en la propia definición de columna o utilizando la construcción s:datatype como 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 el atributo dt:type completamente de la definición de fila, el tipo de la columna será una cadena de longitud variable, de forma predeterminada.

Si dispone de más información de tipos que simplemente el nombre del tipo (por ejemplo, dt:maxLength), es más legible utilizar el elemento secundario de s:datatype. Sin embargo, se trata simplemente de una convención, no de un requisito.

En los ejemplos siguientes, se muestra con más detalle 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"/> 

El segundo ejemplo muestra un uso sutil del atributo rs:fixedlength. Una columna cuyo atributo rs:fixedlength se establece en el valor true (verdadero) significa que los datos deben tener la longitud definida en el esquema. En este caso, un valor legal para title_id es "123456", como es "123". Sin embargo, "123" no sería válido porque su longitud es 3, no 6. Vea la Guía del programador de OLE DB para obtener una descripción más completa de la propiedad fixedlength.

Tratamiento de valores nulos

Los valores nulos (null) los controla el atributo rs:maybenull. Si se establece el valor de este atributo en true (verdadero), el contenido de la columna puede ser un valor nulo. Además, si la columna no se encuentra en una fila de datos, el usuario que lee los datos de nuevo del conjunto de filas obtendrá un estado nulo desde IRowset::GetData(). Considere las definiciones siguientes 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 que CompanyName sea nulo, pero ShipperID no puede contener ningún valor nulo. Si la sección de datos contenía la fila siguiente, el proveedor de persistencia establecería el estado de los datos de la columna CompanyName con el valor de la constante de estado DBSTATUS_S_ISNULL de OLE DB:

 
<z:row ShipperID="1"/> 

Si la fila estaba totalmente vacía, como se muestra 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 lo mismo que un valor 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 este caso, CompanyName es simplemente "" (una cadena de longitud cero).

Para obtener más información acerca de 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.