ID Artikel: 189657 - Kajian Terakhir: 20 September 2011 - Revisi: 2.0

Cara menggunakan perintah bentuk ADO

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini menjelaskan ADO BENTUK sintaks untuk memproduksi hirarkis recordsets, perintah dan menjelaskan cara untuk melintasi recordsets hirarkis. VBA sampel kode adalah juga disediakan.

INFORMASI LEBIH LANJUT

Anda dapat menggunakan recordsets hirarkis sebagai alternatif JOIN dan GROUP BY sintaks ketika Anda perlu untuk mengakses orangtua-anak dan ringkasan data.

Recordsets hirarkis yang digunakan dalam banyak produk: Xbase produk menggunakan perintah SET hubungan, akses menggunakan "Tersegmentasi Virtual tabel" secara internal untuk laporan dengan tingkat pengelompokan, dan sebagainya. Hirarki memberikan kemampuan untuk membangun satu atau beberapa recordsets, mendefinisikan kelompok, dan menentukan agregat perhitungan atas anak recordsets. Meskipun Anda dapat menerapkan fungsi yang sama melalui kode, fungsi ini pergeseran banyak biasa bekerja dari pengembang ke sistem.

Hirarkis recordsets tersedia melalui penyedia MSDataShape, yang diimplementasikan oleh mesin kursor klien.

Hirarkis recordsets berbeda dari SQL BERGABUNG dan KELOMPOK OLEH pernyataan dalam bahwa dengan BERGABUNG, bidang tabel orangtua dan anak bidang tabel diwakili dalam recordset sama. Dengan recordset hirarkis, recordset berisi hanya bidang dari tabel orangtua. Selain itu, recordset berisi bidang tambahan yang mewakili data terkait anak, yang dapat Anda tetapkan untuk kedua recordset variabel dan melintasi.

Ketika Anda melakukan fungsi agregat menggunakan KELOMPOK OLEH dan agregat operator, hanya agregat nilai muncul di Recordset. Dengan hirarkis recordsets, nilai-nilai agregat diwakili orangtua recordset dan catatan detail adalah anak Recordset.

Anda dapat membuat tiga jenis bentuk, dan setiap jenis memiliki kekuatan dan kelemahan sendiri. Anda harus memilih mekanisme yang terbaik sesuai dengan kebutuhan aplikasi Anda dan lingkungan Anda akan berjalan Anda aplikasi. Jenis-jenis BENTUK adalah sebagai berikut:
  • Hubungan berbasis
  • Parameter berbasis
  • Kelompok yang berbasis
Dua yang pertama sama dalam bahwa mereka menghasilkan hirarki yang Jika tidak dapat diwakili oleh SQL BERGABUNG pernyataan. Mereka berbeda dalam bahwa semua orang tua dan anak catatan membaca ke cache lokal sebelum setiap pengolahan terus dalam hierarki berdasarkan hubungan. Jenis hirarki memiliki overhead awal tinggi ketika mengambil catatan, tetapi overhead rendah setelah awal pengambilan.

Pada awalnya, hierarki berdasarkan parameter hanya membaca Parent catatan dan mengambil anak catatan pada permintaan. Meskipun awal overhead dikurangi, Anda harus mengeluarkan permintaan anak baru untuk setiap orangtua record yang diakses, dan Anda harus mempertahankan sambungan ke sumber data untuk sebagai selama recordset ini terbuka.

Hierarki berdasarkan grup adalah pernyataan SQL setara dengan memproduksi agregat bergabung dengan detail SQL pernyataan atau melakukan fungsi agregat pada non-dinormalisasi data. Anda tidak dapat memperbarui kolom ringkasan dan kolom dihitung karena mereka mungkin berasal dari lebih dari satu catatan. Seperti berbasis hubungan hirarki, semua catatan harus membaca di depan.

Recordsets hirarkis yang dibuat tersedia oleh BENTUK klausa. Sintaks sederhana disediakan pertama, kemudian contoh dengan diagram. Karena BENTUK sintaks dapat mendapatkan cukup kompleks, tata-bahasa formal untuk bentuk klausul ini disediakan di akhir artikel untuk memungkinkan Anda untuk memperluas contoh. Anda juga dapat menggunakan program pada akhir artikel ini untuk menguji Anda sendiri BENTUK pernyataan. Contoh menggunakan tabel dari sampel Northwind database.

Sintaks sederhana

   SHAPE {parent-statement}
   APPEND Aggregate
        | ({child-statement} [As Alias]
          RELATE parent-field TO child-field | parameter-marker
                 [, parent-field TO child-field | parameter-marker ...])
          [, Aggregate | ({child statement})...]

   SHAPE {non-normalized-statement} [AS Alias]
   COMPUTE Aggregate
         | Alias
         | ({child-statement} [As Alias] RELATE parent-field TO
                                        child-field | parameter-marker)
           [, Aggregate | Alias | ({child-statement}...)]
   [BY grouping-field [, grouping-field]]

   SHAPE {non-normalized-statement} [AS Alias]
   BY grouping-field [, grouping-field]
				

CATATAN:

  1. Jika Anda memilih bidang identik bernama dari berbeda tabel, Anda mungkin perlu alias mereka untuk memastikan bahwa BENTUK parser bekerja.
  2. The BENTUK MENAMBAHKAN fungsi sama dengan JOIN LUAR bahwa catatan orangtua kembali, bahkan jika tidak ada catatan anak ada untuk itu.
  3. Agregat hanya dapat beroperasi pada bidang segera anak-anak recordset. Untuk beroperasi pada bidang dalam cucu, dan sebagainya, Anda harus menghasilkan menengah agregat. Melihat hirarki grup dengan Agregat contoh pada akhir artikel ini untuk ilustrasi.
  4. Jika Anda menggunakan fungsi agregat dengan BENTUK MENAMBAHKAN sintaks, nilai agregat akan menduduki lapangan ditambahkan ke induk resultset, yang juga berisi bidang dari pernyataan orangtua. Dalam Sebaliknya, BENTUK MENGHITUNG dan BENTUK OLEH membuat tingkat orangtua baru untuk agregat dan non-dinormalisasi-pernyataan menjadi recordset anak.
  5. The BENTUK penyedia memerlukan bahwa Anda menyertakan Alias untuk non-dinormalisasi-pernyataan di MENGHITUNG klausul ketika menggunakan BENTUK MENGHITUNG. Kegagalan untuk melakukannya mengakibatkan pesan bahwa fungsi tidak didukung, meskipun itu tidak menghasilkan kesalahan sintaks.

Contoh

Hirarki hubungan sederhana:

   SHAPE  {select * from customers}
   APPEND ({select * from orders} AS rsOrders
           RELATE customerid TO customerid)
				
yang menghasilkan:
   Customers.*
   rsOrders
        |
        +----Orders.*
				
Dalam diagram sebelumnya, orangtua recordset berisi semua bidang dari meja pelanggan dan field yang disebut rsOrders. rsOrders menyediakan referensi untuk recordset anak, dan berisi semua bidang dari perintah tabel. Contoh lain menggunakan notasi yang sama.

Hirarki parameterized:

   SHAPE  {select * from customers}
   APPEND ({select * from orders where customerid = ?} AS rsOrders
           RELATE customerid TO PARAMETER 0)
				
Hal ini mengakibatkan hierarki yang sama sebagai hubungan sederhana hirarki.

Senyawa hubungan hirarki:

Contoh ini menggambarkan tiga tingkat hirarki pelanggan, Order, dan urutan rincian:
   SHAPE  {SELECT * from customers}
   APPEND ((SHAPE  {select * from orders}
            APPEND ({select * from [order details]} AS rsDetails
                   RELATE orderid TO orderid)) AS rsOrders
          RELATE customerid TO customerid)
				
yang menghasilkan:
   Customers.*
   rsOrders
        |
        +----Orders.*
             rsDetails
                 |
                 +----[Order Details].*
				

Beberapa hubungan hirarki:

Contoh ini menggambarkan hierarki yang melibatkan recordset orangtua dan dua anak recordsets, salah satunya adalah parameterized:
   SHAPE  {SELECT * FROM customers}
   APPEND ({SELECT *
            FROM orders
            WHERE orderdate < #1/1/1998# AND customerid = ?}
            RELATE customerid TO PARAMETER 0) AS rsOldOrders,
          ({SELECT *
            FROM orders
            WHERE orderdate >= #1/1/1998#}
            RELATE customerid TO customerid) AS rsRecentOrders
				
yang menghasilkan:
   Customers.*
   rsOldOrders
        |
        +----Orders.*
   rsRecentOrders
        |
        +----Orders.*
				

Hierarki dengan agregat:

   SHAPE  (select * from orders}
   APPEND ({select od.orderid, od.UnitPrice * od.quantity as ExtendedPrice
            from [order details] As od}
          RELATE orderid TO orderid) As rsDetails,
          SUM(ExtendedPrice) AS OrderTotal
				
yang menghasilkan:
   Orders.*
   rsDetails
       |
       +----orderid
            ExtendedPrice
   OrderTotal
				

Hirarki grup:

   SHAPE  {select customers.customerid AS cust_id, orders.*
           from customers inner join orders
           on customers.customerid = orders.customerid} AS rsOrders
   COMPUTE rsOrders BY cust_id
				
yang menghasilkan:
   rsOrders
       |
       +----cust_id
            Orders.*
   cust_id
				

Hirarki grup dengan agregat:

CATATAN: batin BENTUK klausul dalam contoh ini identik dengan pernyataan yang digunakan dalam hierarki dengan contoh agregat.
   SHAPE
           (SHAPE   {select customers.*, orders.orderid, orders.orderdate
                     from customers inner join orders
                     on customers.customerid = orders.customerid}
            APPEND  ({select od.orderid,
                             od.unitprice * od.quantity as ExtendedPrice
                      from [order details] as od} AS rsDetails
                    RELATE orderid TO orderid),
                    SUM(rsDetails.ExtendedPrice) AS OrderTotal) AS rsOrders
   COMPUTE  rsOrders,
            SUM(rsOrders.OrderTotal) AS CustTotal,
            ANY(rsOrders.contactname) AS Contact
   BY       customerid
				
yang menghasilkan:
   rsOrders
        |
        +----Customers.*
             orderid
             orderdate
             rsDetails
                  |
                  +----orderid
                       ExtendedPrice
             OrderTotal
   CustomerTotal
   Contact
   customerid
				

Beberapa kelompok:

   SHAPE
          (SHAPE  {select customers.*,
                          od.unitprice * od.quantity as ExtendedPrice
                   from (customers inner join orders
                   on customers.customerid = orders.customerid) inner join
                   [order details] as od on orders.orderid = od.orderid}
                          AS rsDetail
           COMPUTE ANY(rsDetail.contactname) AS Contact,
                   ANY(rsDetail.region) AS Region,
                   SUM(rsDetail.ExtendedPrice) AS CustTotal,
                   rsDetail
           BY customerid) AS rsCustSummary
   COMPUTE rsCustSummary
   BY      Region
				
yang menghasilkan:
   rsCustSummary
        |
        +-----Contact
              Region
              CustTotal
              rsDetail
                   |
                   +----Customers.*
                        ExtendedPrice
              customerid
   Region
				

Grand Total:

   SHAPE
          (SHAPE  {select customers.*,
                          od.unitprice * od.quantity as ExtendedPrice
                   from (customers inner join orders
                   on customers.customerid = orders.customerid) inner join
                   [order details] as od on orders.orderid = od.orderid}
                          AS rsDetail
           COMPUTE ANY(rsDetail.contactname) AS Contact,
                   SUM(rsDetail.ExtendedPrice) AS CustTotal,
                   rsDetail
           BY customerid) AS rsCustSummary
   COMPUTE SUM(rsCustSummary.CustTotal) As GrandTotal,
           rsCustSummary
				
Catatan yang hilang OLEH klausa dalam ringkasan luar. Ini mendefinisikan Grand Total karena rowset orangtua berisi satu catatan data dengan jumlah total dan sebuah penunjuk untuk recordset anak.
   GrandTotal
   rsCustSummary
        |
        +-----Contact
              CustTotal
              rsDetail
                  |
                  +----Customers.*
                       ExtendedPrice
              customerid
				

Hirarki kompleks:

Contoh ini menggambarkan hierarki yang berisi satu orangtua rowset, dua anak rowsets, salah satunya adalah parameterized, dan kelompok detail.
   SHAPE {select customers.* from customers} AS rsDetail
   COMPUTE rsDetail,
           ANY(rsDetail.companyname) AS Company,
           ({select * from orders where customerid = ?}
                   RELATE customerid TO PARAMETER 0) AS rsOrders,
           COUNT(rsOrders.orderid) AS OrderCount
   BY customerid
				
yang menghasilkan:
rsDetail
        |
        +----Customers.*
   Company
   rsOrders
        |
        +----Orders.*
   OrderCount
   customerid
				

Orangtua dikelompokkan terkait dikelompokkan anak:

   SHAPE
          (SHAPE  {select * from customers}
           APPEND ((SHAPE {select orders.*, year(orderdate) as OrderYear,
                                  month(orderdate) as OrderMonth
                           from orders} AS rsOrders
                    COMPUTE rsOrders
                    BY customerid, OrderYear, OrderMonth)
                    RELATE customerid TO customerid) AS rsOrdByMonth )
           AS rsCustomers
   COMPUTE rsCustomers
   BY      region
				
yang menghasilkan:
   rsCustomers
        |
        +-----customers.*
              rsOrdByMonth
                 |
                 +-----rsOrders
                            |
                            +---- Orders.*
                       customerid
                       OrderYear
                       OrderMonth
   region
				

BENTUK klausul tata bahasa Formal

  <shape-command>      ::=  SHAPE <table-exp> [AS <alias>]
                            [<shape_action>]

  <shape-action>       ::=  APPEND <aliased-field-list>
                            | COMPUTE <aliased-field-list>
                              [BY <field-list>]
                            | BY <field-list>

  <table-exp>          ::=  {<native-sql-statement>}
                            | ( <shape-command> )
 
  <aliased-field-list> ::=  <aliased-field> [, <aliased-field...]
 
  <aliased-field>      ::=  <field-exp> [AS <alias>]
 
  <field-exp>          ::=  ( <relation-exp> ) | <calculated-exp>
 
  <relation_exp>       ::=   <table-exp> [AS <alias>] RELATE
                             <relation-cond-list>
 
  <relation-cond-list> ::=   <relation-cond> [, <relation-cond>...]
 
  <relation-cond>      ::=   <field-name> TO <child-ref>
 
  <child-ref>          ::=   <field-name> | PARAMETER <param-ref>
 
  <param-ref>          ::=   <name> | <number>
 
  <field-list>         ::=   <field-name [, <filed-name>]
 
  <calculated-exp>     ::=   SUM (<qualified-field-name>)
                             | AVG (<qualified-field-name>)
                             | MIN (<qualified-field-name>)
                             | MAX (<qualified-field-name>)
                             | COUNT (<alias>)
                             | SDEV (<qualified-field-name>)
                             | ANY (<qualified-field-name>)
                             | CALC (<expression>)
 
  <qualified-field-name>::=  <alias>.<field-name> | <field-name>
 
  <alias>               ::=  <quoted-name>
 
  <field-name>          ::=  <quoted-name>
 
  <quoted-name>         ::=  "<string>" | '<string>' | <name>
 
  <name>                ::=  alpha [ alpha | digit | _ | # ...]
 
  <number>              ::=  digit [digit...]
 
  <string>              ::=  unicode-char [unicode-char...]
 
  <expression>          ::=  an expression recognized by the Jet
                             Expression service whose operands are
                             other non-CALC columns in the same row.
				

Program tes bentuk VBA

Berikut kode program VBA memungkinkan Anda ketik Anda sendiri BENTUK perintah dan menampilkan hirarki lapangan atau menunjukkan lokasi kesalahan sintaks.

PERINGATAN: GUNAKAN KODE YANG TERSEDIA DI DALAM ARTIKEL INI RISIKO ANDA SENDIRI. Microsoft menyediakan kode ini "sebagaimana adanya" tanpa jaminan apapun, baik tersurat maupun tersirat, termasuk namun tidak terbatas pada garansi tersirat keadaan yang dapat diperjualbelikan atau kesesuaian untuk tujuan tertentu.
  1. Dalam ODBC Administrator panel kontrol menambahkan DSN untuk pengandar Microsoft Access 97 ODBC disebut OLE_DB_NWIND_JET menunjuk ke Database Northwind (atau NWIND).
  2. Membuat proyek baru. Menambahkan dua kotak teks (Text1, dan Text2) dan tombol perintah (Command1).
  3. Membuat kedua Druckerauswahl yang cukup besar untuk menampilkan beberapa baris teks dan menetapkan properti berikut:
          Multiline: True                (Visual Basic only)
          Scrollbars: Vertical
          Font: Courier New 10 Point
    					
  4. Pada Project menu, pilih Referensi dan menambahkan referensi ke objek Data ActiveX Microsoft Perpustakaan.
  5. Tambahkan kode berikut:
       Private Sub Command1_Click()
       Dim cn As ADODB.Connection, rs As ADODB.Recordset
         Me!Text2.Text = ""
         Set cn = New ADODB.Connection
         Set rs = New ADODB.Recordset
         cn.Provider = "MSDataShape"
         cn.Open "dsn=OLE_DB_NWIND_JET"
         On Error Resume Next
         rs.Open Me!Text1.Text, cn, adOpenStatic, adLockReadOnly, adCmdText
         If Err Then MsgBox Error
         ListChapteredFields rs, 0
         rs.Close
         cn.Close
         Set rs = Nothing
         Set cn = Nothing
       End Sub
    
       Private Sub LogText(ByVal sLine As String)
         If Me!Text2.Text = "" Then
           Me!Text2.Text = sLine
         Else
           Me!Text2.Text = Me!Text2.Text & vbCrLf & sLine
         End If
       End Sub
    
       Private Sub ListChapteredFields(ByVal rs As ADODB.Recordset, _
                                          ByVal Level As Long)
       Dim I As Long
         For I = 0 To rs.Fields.Count - 1
           LogText Space$(Level * 3) & rs(I).Name
           If rs(I).Type = adChapter Then
             ListChapteredFields rs(I).Value, Level + 1
           End If
         Next I
       End Sub
    					
  6. Menjalankan proyek. Jenis BENTUK perintah ke Text1, klik tombol perintah dan hirarki muncul di Text2.
CATATAN: Teks berikut menyediakan contoh menggunakan Microsoft Jet OLEDB penyedia penyedia bentuk:
  cn.Provider = "MSDataShape"
  cn.Open "Data Provider=Microsoft.Jet.OLEDB.4.0"
				
CATATAN: Jika Anda misspell nama lapangan atau meja ketika menggunakan Access 97 ODBC driver atau SENTAKAN penyedia, Anda akan menerima pesan berikut:
Parameter terlalu sedikit. N diharapkan.
Lainnya penyedia mungkin menghasilkan pesan yang berbeda.

REFERENSI

ADO 2.0 hirarkis kursor spesifikasi

Untuk informasi tambahan tentang BENTUK MENAMBAHKAN sintaks dan bagaimana untuk melewati hirarkis recordsets, silakan lihat artikel berikut pada Basis Pengetahuan Microsoft:
185425  (http://support.microsoft.com/kb/185425/EN-US/ ) ADO hirarkis Recordsets melalui bentuk MENAMBAHKAN melalui C + +/ VBA/Jawa

Berlaku bagi:
  • Microsoft ActiveX Data Objects 2.7
Kata kunci: 
kbdatabase kbhowto kbprovider kbmt KB189657 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:189657  (http://support.microsoft.com/kb/189657/en-us/ )
Retired KB ArticleSanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.