Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A seção de esquema é necessária. Como 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 carregar no XML, o ADO requer apenas os nomes das colunas e o conjunto de linhas ao qual pertencem. Aqui está 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.
Criando aliases para nomes de coluna
O atributo rs:name permite que você crie um alias para um nome de coluna para 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 usaria o atributo de nome (não rs:name) para se referir a essa coluna:
"<row s1="1" s2="Speedy Express" s3="(503) 555-9831"/>
A criação de aliases para nomes de coluna é necessária sempre que um nome de coluna não é um atributo ou nome de marca válido em XML. Por exemplo, "LastName" deve 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ê deve 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 deve ser usado consistentemente em cada lugar em que a coluna é referenciada nas seções de esquema e dados do documento XML. O exemplo a seguir mostra o uso consistente do 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
deve ser usado consistentemente em todo o documento.
Tipos de dados
Você pode aplicar um tipo de dados a uma coluna com o atributo dt:type. Para consultar o guia definitivo dos tipos XML permitidos, veja a seção de Tipos de Dados da especificação W3C XML-Data. 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 da 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 torna mais legível usar o elemento filho s:datatype. Isso é apenas uma convenção, no entanto, e não um requisito.
Os exemplos a seguir mostram mais como incluir informações de tipo em seu 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 devem ter o comprimento definido no esquema. Nesse caso, um valor válido para title_id é "123456", assim como "123". No entanto, "123" não seria válido porque seu comprimento é 3, não 6. Consulte o Guia do Programador OLE DB para obter uma descrição mais completa da propriedade fixedlength.
Manipulando 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 de volta do conjunto de linhas receberá 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
para a constante de status OLE DB DBSTATUS_S_ISNULL:
<z:row ShipperID="1"/>
Se a linha estivesse totalmente vazia, da seguinte maneira, o Provedor de Persistência retornaria um status OLE DB de 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 nula.
<z:row ShipperID="1" CompanyName=""/>
Para a linha anterior, o Provedor de Persistência retornará um status OLE DB de DBSTATUS_S_OK para ambas as colunas. O CompanyName
nesse caso é simplesmente "" (uma cadeia de caracteres de comprimento zero).
Para obter mais informações sobre as construções OLE DB disponíveis para uso no esquema de um documento XML para OLE DB, consulte a definição de "urn:schemas-microsoft-com:rowset" e o Guia do Programador OLE DB.