Bagikan melalui


Himpunan Catatan Hierarkis di XML

ADO memungkinkan persistensi objek Recordset hierarkis ke dalam XML. Dengan objek Recordset hierarkis, nilai bidang di Recordset induk adalah Recordset lainnya. Bidang tersebut direpresentasikan sebagai elemen anak dalam aliran XML daripada atribut .

Keterangan

Contoh berikut menunjukkan kasus ini:

Rs.Open "SHAPE {select stor_id, stor_name, state from stores} APPEND ({select stor_id, ord_num, ord_date, qty from sales} AS rsSales RELATE stor_id TO stor_id)", "Provider=MSDataShape;DSN=pubs;Integrated Security=SSPI;"  

Berikut ini adalah format XML dari Recordset yang bertahan:

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"     xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"     xmlns:rs="urn:schemas-microsoft-com:rowset"   
    xmlns:z="#RowsetSchema">   
  <s:Schema id="RowsetSchema">   
    <s:ElementType name="row" content="eltOnly" rs:updatable="true">   
      <s:AttributeType name="stor_id" rs:number="1"   
        rs:writeunknown="true">   
        <s:datatype dt:type="string" dt:maxLength="4"   
          rs:fixedlength="true" rs:maybenull="false"/>   
      </s:AttributeType>   
      <s:AttributeType name="stor_name" rs:number="2" rs:nullable="true"   
        rs:writeunknown="true">   
          <s:datatype dt:type="string" dt:maxLength="40"/>   
      </s:AttributeType>   
      <s:AttributeType name="state" rs:number="3" rs:nullable="true"   
        rs:writeunknown="true">   
        <s:datatype dt:type="string" dt:maxLength="2"   
          rs:fixedlength="true"/>   
      </s:AttributeType>   
      <s:ElementType name="rsSales" content="eltOnly"   
        rs:updatable="true" rs:relation="010000000100000000000000">   
        <s:AttributeType name="stor_id" rs:number="1"   
          rs:writeunknown="true">   
          <s:datatype dt:type="string" dt:maxLength="4"   
            rs:fixedlength="true" rs:maybenull="false"/>   
        </s:AttributeType>   
        <s:AttributeType name="ord_num" rs:number="2"   
          rs:writeunknown="true">   
          <s:datatype dt:type="string" dt:maxLength="20"   
            rs:maybenull="false"/>   
        </s:AttributeType>   
        <s:AttributeType name="ord_date" rs:number="3"   
          rs:writeunknown="true">   
            <s:datatype dt:type="dateTime" dt:maxLength="16"   
              rs:scale="3" rs:precision="23" rs:fixedlength="true"   
              rs:maybenull="false"/>   
        </s:AttributeType>   
        <s:AttributeType name="qty" rs:number="4" rs:writeunknown="true">   
          <s:datatype dt:type="i2" dt:maxLength="2" rs:precision="5"   
            rs:fixedlength="true" rs:maybenull="false"/>   
        </s:AttributeType>   
        <s:extends type="rs:rowbase"/>   
      </s:ElementType>   
      <s:extends type="rs:rowbase"/>   
    </s:ElementType>   
  </s:Schema>   
  <rs:data>   
    <z:row stor_id="6380" stor_name="Eric the Read Books" state="WA">   
      <rsSales stor_id="6380" ord_num="6871"   
        ord_date="1994-09-14T00:00:00" qty="5"/>   
      <rsSales stor_id="6380" ord_num="722a"   
        ord_date="1994-09-13T00:00:00" qty="3"/>   
    </z:row>   
    <z:row stor_id="7066" stor_name="Barnum's" state="CA">   
      <rsSales stor_id="7066" ord_num="A2976"   
        ord_date="1993-05-24T00:00:00" qty="50"/>   
      <rsSales stor_id="7066" ord_num="QA7442.3"   
        ord_date="1994-09-13T00:00:00" qty="75"/>   
    </z:row>   
    <z:row stor_id="7067" stor_name="News & Brews" state="CA">   
      <rsSales stor_id="7067" ord_num="D4482"   
        ord_date="1994-09-14T00:00:00" qty="10"/>   
      <rsSales stor_id="7067" ord_num="P2121"   
        ord_date="1992-06-15T00:00:00" qty="40"/>   
      <rsSales stor_id="7067" ord_num="P2121"   
        ord_date="1992-06-15T00:00:00" qty="20"/>   
      <rsSales stor_id="7067" ord_num="P2121"   
        ord_date="1992-06-15T00:00:00" qty="20"/>   
    </z:row>   
  </rs:data>   
</xml>   

Urutan kolom yang tepat dalam Recordset induk tidak jelas ketika dipertahankan dengan cara ini. Bidang apa pun di induk mungkin berisi SetRekam anak. Penyedia Persistensi mempertahankan semua kolom skalar terlebih dahulu sebagai atribut dan kemudian mempertahankan semua "kolom" Recordset turunan sebagai elemen turunan dari baris induk. Posisi ordinal bidang di Recordset induk dapat diperoleh dengan melihat definisi skema Recordset. Setiap bidang memiliki properti OLE DB, rs:number, yang ditentukan dalam namespace layanan skema Recordset yang berisi nomor ordinal untuk bidang tersebut.

Nama semua bidang dalam Recordset turunan digabungkan dengan nama bidang di Recordset induk yang berisi anak ini. Hal ini untuk memastikan bahwa tidak ada tabrakan nama dalam kasus di mana Recordset induk dan anak keduanya berisi bidang yang diperoleh dari dua tabel yang berbeda tetapi dinamai secara tunggal.

Saat menyimpan Recordset hierarkis ke XML, Anda harus mengetahui pembatasan berikut di ADO:

  • Recordset hierarkis dengan pembaruan tertunda tidak dapat dipertahankan ke XML.

  • Recordset hierarkis yang dibuat dengan perintah bentuk parameter tidak dapat dipertahankan (dalam format XML atau ADTG).

  • ADO saat ini menyimpan hubungan antara induk dan Recordset anak sebagai objek besar biner (BLOB). Tag XML untuk menjelaskan hubungan ini belum ditentukan dalam namespace layanan skema set baris.

  • Saat Recordset hierarki disimpan, semua Recordset turunan disimpan bersama dengannya. Jika Recordset saat ini adalah turunan dari Recordset lain, induknya tidak disimpan. Semua Recordset turunan yang membentuk subtree dari Recordset saat ini disimpan.

Saat Recordset hierarkis dibuka kembali dari format xml-persisted-nya, Anda harus mengetahui batasan berikut:

  • Jika rekaman anak berisi rekaman yang tidak ada rekaman induk yang sesuai, baris ini tidak ditulis dalam representasi XML dari Recordset hierarkis. Dengan demikian, baris ini akan hilang ketika Recordset dibuka kembali dari lokasi yang bertahan.

  • Jika rekaman anak memiliki referensi ke lebih dari satu rekaman induk, maka saat membuka kembali Recordset, Recordset turunan mungkin berisi rekaman duplikat. Namun, duplikat ini hanya akan terlihat jika pengguna bekerja langsung dengan set baris anak yang mendasar. Jika bab digunakan untuk menavigasi Recordset anak (itu adalah satu-satunya cara untuk menavigasi melalui ADO), duplikat tidak terlihat.

Lihat juga

Menyimpan Rekaman dalam Format XML