Compartilhar via


Seção de esquema

A seção de esquema é necessária. Conforme mostra o exemplo anterior, o ADO grava metadados detalhados sobre cada coluna para preservar a semântica dos valores de dados o máximo possível para atualização. No entanto, para carregá-los no XML, o ADO exige apenas os nomes das colunas e o conjunto de linhas ao qual pertencem. Veja um exemplo de um 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>  

No exemplo anterior, o ADO tratará os dados como cadeias de caracteres de comprimento variável porque nenhuma informação de tipo está incluída no esquema.

Como criar aliases para nomes de colunas

O atributo rs:name permite que você crie um alias para um nome de coluna, de modo que um nome amigável possa aparecer nas informações de coluna expostas pelo conjunto de linhas e um nome mais curto possa ser usado na seção de dados. Por exemplo, o esquema anterior pode ser modificado para mapear ShipperID para s1, CompanyName para s2 e Phone para s3 da seguinte maneira:

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

Em seguida, na seção de dados, a linha usará o atributo de nome (não rs:name) para referenciar essa coluna:

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

A criação de aliases para nomes de colunas é necessária sempre que um nome de coluna não é um nome de marca ou um atributo válido em XML. Por exemplo, "LastName" precisa ter um alias porque nomes com espaços inseridos são atributos inválidos. A linha a seguir não será tratada corretamente pelo analisador XML. Portanto, você precisa criar um alias para algum outro nome que não tenha um espaço inserido.

<row last name="Jones"/>  

Qualquer valor usado para o atributo de nome precisa ser usado de maneira consistente em cada lugar em que a coluna é referenciada nas seções de esquema e de dados do documento XML. O seguinte exemplo mostra o uso consistente 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>  

Da mesma forma, como não há nenhum alias definido para CompanyName no exemplo anterior, CompanyName precisa ser usado de maneira consistente em todo o documento.

Tipos de dados

Você pode aplicar um tipo de dados a uma coluna com o atributo dt:type. Para obter o guia definitivo dos tipos XML permitidos, confira a seção Tipos de dados da especificação de Dados XML do W3C. Você pode especificar um tipo de dados de duas maneiras: especifique o atributo dt:type diretamente na própria definição de coluna ou use o constructo s:datatype como um elemento aninhado da definição de coluna. Por exemplo,

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

é equivalente a

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

Se você omitir o atributo dt:type inteiramente da definição de linha, por padrão, o tipo da coluna será uma cadeia de caracteres de comprimento variável.

Se você tiver mais informações de tipo do que simplesmente o nome do tipo (por exemplo, dt:maxLength), isso tornará mais legível o uso do elemento filho s:datatype. No entanto, isso é apenas uma convenção, não um requisito.

Os exemplos a seguir mostram mais detalhes de como incluir informações de tipo no 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"/>  

Há um uso sutil do atributo rs:fixedlength no segundo exemplo. Uma coluna com o atributo rs:fixedlength definido como true significa que os dados precisam ter o comprimento definido no esquema. Nesse caso, um valor válido para title_id é "123456", assim como "123". No entanto, "123" não será válido porque o comprimento é 3, não 6. Confira o Guia do Programador do OLE DB para ver uma descrição mais completa da propriedade fixedlength.

Como tratar valores nulos

Os valores nulos são tratados pelo atributo rs:maybenull. Se esse atributo for definido como true, o conteúdo da coluna poderá conter um valor nulo. Além disso, se a coluna não for encontrada em uma linha de dados, o usuário que ler os dados novamente do conjunto de linhas obterá um status nulo de IRowset::GetData(). Considere as definições de coluna a seguir da tabela 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>  

A definição permite que CompanyName seja nulo, mas ShipperID não pode conter um valor nulo. Se a seção de dados contiver a seguinte linha, o Provedor de Persistência definirá o status dos dados da coluna CompanyName como a constante de status DBSTATUS_S_ISNULL do OLE DB:

<z:row ShipperID="1"/>  

Se a linha estiver totalmente vazia, conforme mostrado a seguir, o Provedor de Persistência retornará o status do OLE DB DBSTATUS_E_UNAVAILABLE para ShipperID e DBSTATUS_S_ISNULL para CompanyName.

<z:row/>   

Observe que uma cadeia de caracteres de comprimento zero não é igual a nulo.

<z:row ShipperID="1" CompanyName=""/>  

Na linha anterior, o Provedor de Persistência retornará o status DBSTATUS_S_OK do OLE DB para as duas colunas. Nesse caso, CompanyName é simplesmente "" (uma cadeia de caracteres de comprimento zero).

Para obter mais informações sobre os constructos do OLE DB disponíveis para uso no esquema de um documento XML para OLE DB, confira a definição de "urn:schemas-microsoft-com:rowset" e o Guia do Programador do OLE DB.

Consulte Também

Persistência de registros em formato XML