Bagikan melalui


Bagian Skema

Bagian skema diperlukan. Seperti yang ditunjukkan contoh sebelumnya, ADO menulis metadata terperinci tentang setiap kolom untuk mempertahankan semantik nilai data sebanyak mungkin untuk diperbarui. Namun, untuk memuat di XML, ADO hanya memerlukan nama kolom dan set baris tempat kolom berada. Berikut adalah contoh skema minimal:

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

Dalam contoh sebelumnya, ADO akan memperlakukan data sebagai string panjang variabel karena tidak ada informasi jenis yang disertakan dalam skema.

Membuat Alias untuk Nama Kolom

Atribut rs:name memungkinkan Anda membuat alias untuk nama kolom sehingga nama yang mudah diingat dapat muncul di informasi kolom yang diekspos oleh set baris dan nama yang lebih pendek dapat digunakan di bagian data. Misalnya, skema sebelumnya dapat dimodifikasi untuk memetakan ShipperID ke s1, CompanyName ke s2, dan Telepon ke s3 sebagai berikut:

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

Kemudian, di bagian data, baris akan menggunakan atribut nama (bukan rs:name) untuk merujuk ke kolom tersebut:

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

Membuat alias untuk nama kolom diperlukan setiap kali nama kolom bukan atribut atau nama tag yang valid di XML. Misalnya, "LastName" harus memiliki alias karena nama dengan spasi yang disematkan adalah atribut yang tidak valid. Baris berikut ini tidak akan ditangani dengan benar oleh pengurai XML, jadi Anda harus membuat alias ke beberapa nama lain yang tidak memiliki ruang yang disematkan.

<row last name="Jones"/>  

Nilai apa pun yang Anda gunakan untuk atribut nama harus digunakan secara konsisten di setiap tempat bahwa kolom direferensikan di bagian skema dan data dokumen XML. Contoh berikut menunjukkan penggunaan s1 yang konsisten:

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

Demikian pula, karena tidak ada alias yang ditentukan untuk CompanyName dalam contoh sebelumnya, CompanyName harus digunakan secara konsisten di seluruh dokumen.

Jenis Data

Anda dapat menerapkan jenis data ke kolom dengan atribut dt:type. Untuk panduan definitif untuk jenis XML yang diizinkan, lihat bagian Jenis Data dari spesifikasi XML-Data W3C. Anda dapat menentukan jenis data dengan dua cara: menentukan atribut dt:type langsung pada definisi kolom itu sendiri atau menggunakan konstruksi s:datatype sebagai elemen berlapis dari definisi kolom. Misalnya,

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

setara dengan

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

Jika Anda menghilangkan atribut dt:type sepenuhnya dari definisi baris, secara default, jenis kolom akan menjadi string panjang variabel.

Jika Anda memiliki lebih banyak informasi jenis daripada sekadar nama jenis (misalnya, dt:maxLength), itu membuatnya lebih mudah dibaca untuk menggunakan elemen anak s:datatype. Namun, ini hanyalah konvensi, dan bukan persyaratan.

Contoh berikut menunjukkan lebih lanjut cara menyertakan informasi jenis dalam skema Anda.

<!-- 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"/>  

Ada penggunaan halus dari atribut rs:fixedlength dalam contoh kedua. Kolom dengan atribut rs:fixedlength diatur ke true berarti bahwa data harus memiliki panjang yang ditentukan dalam skema. Dalam hal ini, nilai yang valid untuk title_id adalah "123456," seperti "123 ." Namun, "123" tidak akan valid karena panjangnya adalah 3, bukan 6. Lihat Panduan Programmer OLE DB untuk deskripsi yang lebih lengkap tentang properti fixedlength.

Menangani Null

Nilai null ditangani oleh atribut rs:maybenull. Jika atribut ini diatur ke true, konten kolom dapat berisi nilai null. Selain itu, jika kolom tidak ditemukan dalam baris data, pengguna yang membaca data kembali dari set baris akan mendapatkan status null dari IRowset::GetData(). Pertimbangkan definisi kolom berikut dari tabel 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>  

Definisi memungkinkan CompanyName untuk null, tetapi ShipperID tidak dapat berisi nilai null. Jika bagian data berisi baris berikut, Penyedia Persistensi akan mengatur status data untuk CompanyName kolom ke konstanta status OLE DB DBSTATUS_S_ISNULL:

<z:row ShipperID="1"/>  

Jika baris sepenuhnya kosong, sebagai berikut, Penyedia Persistensi akan mengembalikan status OLE DB DBSTATUS_E_UNAVAILABLE untuk ShipperID dan DBSTATUS_S_ISNULL untuk CompanyName.

<z:row/>   

Perhatikan bahwa string panjang nol tidak sama dengan null.

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

Untuk baris sebelumnya, Penyedia Persistensi akan mengembalikan status OLE DB DBSTATUS_S_OK untuk kedua kolom. CompanyName Dalam hal ini hanya "" (string panjang nol).

Untuk informasi lebih lanjut tentang konstruksi OLE DB yang tersedia untuk digunakan dalam skema dokumen XML untuk OLE DB, lihat definisi "urn:schemas-microsoft-com:rowset" dan Panduan Programmer OLE DB.

Lihat juga

Menyimpan Rekaman dalam Format XML