Operasi Perintah Berparameter

Jika Anda bekerja dengan Recordset anak besar, terutama dibandingkan dengan ukuran Recordset induk, tetapi hanya perlu mengakses beberapa bab anak, Anda mungkin merasa lebih efisien untuk menggunakan perintah berparameter.

Perintah non-parameter mengambil seluruh Recordset induk dan anak, menambahkan kolom bab ke induk, lalu menetapkan referensi ke bab anak terkait untuk setiap baris induk.

Perintah berparameter mengambil seluruh Recordset induk, tetapi hanya mengambil bab Recordset saat kolom bab diakses. Perbedaan strategi pengambilan ini dapat menghasilkan manfaat performa yang signifikan.

Misalnya, Anda dapat menentukan hal berikut:

SHAPE {SELECT * FROM customer}   
   APPEND ({SELECT * FROM orders WHERE cust_id = ?}   
   RELATE cust_id TO PARAMETER 0)  

Tabel induk dan anak memiliki nama kolom yang sama, cust_id. Perintah anak memiliki tempat penampung "?", yang dirujuk oleh klausa RELATE (yaitu, "... PARAMETER 0").

Catatan

Klausa PARAMETER hanya berkaitan dengan sintaks perintah bentuk. Ini tidak terkait dengan objek Parameter ADO atau koleksi Parameter .

Ketika perintah bentuk berparameter dijalankan, hal berikut ini terjadi:

  1. Perintah induk dijalankan dan mengembalikan Recordset induk dari tabel Pelanggan.

  2. Kolom bab ditambahkan ke Recordset induk.

  3. Saat kolom bab dari baris induk diakses, perintah turunan dijalankan menggunakan nilai customer.cust_id sebagai nilai parameter.

  4. Semua baris dalam himpunan baris penyedia data yang dibuat pada langkah 3 digunakan untuk mengisi Recordset anak. Dalam contoh ini, yaitu semua baris dalam tabel Pesanan di mana cust_id sama dengan nilai customer.cust_id. Secara default, Recordsetturunan akan di-cache pada klien hingga semua referensi ke Recordset induk dirilis. Untuk mengubah perilaku ini, atur Properti dinamisRecordsetBaris Anak Cache ke False.

  5. Referensi ke baris anak yang diambil (yaitu, bab Recordset turunan) ditempatkan di kolom bab dari baris saat ini dari Recordset induk.

  6. Langkah 3-5 diulang saat kolom bab dari baris lain diakses.

Properti dinamis Baris Anak Singgahan diatur ke True secara default. Perilaku penembolokan bervariasi tergantung pada nilai parameter kueri. Dalam kueri dengan parameter tunggal, Recordset turunan untuk nilai parameter tertentu akan di-cache di antara permintaan untuk anak dengan nilai tersebut. Kode berikut menunjukkan hal yang sama:

SCmd = "SHAPE {select * from customer} " & _  
         "APPEND({select * from orders where cust_id = ?} " & _  
         "RELATE cust_id TO PARAMETER 0) AS chpCustOrder"  
Rst1.Open sCmd, Cnn1  
Set RstChild = Rst1("chpCustOrder").Value  
Rst1.MoveNext      ' Next cust_id passed to Param 0, & new rs fetched   
                   ' into RstChild.  
Rst1.MovePrevious  ' RstChild now holds cached rs, saving round trip.  

Dalam kueri dengan dua parameter atau lebih, anak yang di-cache hanya digunakan jika semua nilai parameter cocok dengan nilai cache.

Perintah Berparameter dan Hubungan Anak Induk Yang Kompleks

Selain menggunakan perintah berparameter untuk meningkatkan performa hierarki jenis equi-join, perintah berparameter dapat digunakan untuk mendukung hubungan induk-anak yang lebih kompleks. Misalnya, pertimbangkan database Little League dengan dua tabel: satu terdiri dari tim (team_id, team_name) dan yang lainnya (tanggal, home_team, visiting_team).

Dengan menggunakan hierarki non-parameter, tidak ada cara untuk menghubungkan tabel tim dan permainan sia-sia sehingga Recordset anak untuk setiap tim berisi jadwal lengkapnya. Anda dapat membuat bab yang berisi jadwal rumah atau jadwal jalan, tetapi tidak keduanya. Ini karena klausul RELATE membatasi Anda pada hubungan induk-anak dari formulir (pc1=cc1) AND (pc2=pc2). Jadi, jika perintah Anda menyertakan "RELATE team_id TO home_team, team_id TO visiting_team", Anda hanya akan mendapatkan permainan di mana tim bermain sendiri. Yang Anda inginkan adalah "(team_id=home_team) OR (team_id=visiting_team)", tetapi penyedia Bentuk tidak mendukung klausa OR.

Untuk mendapatkan hasil yang diinginkan, Anda dapat menggunakan perintah berparameter. Contohnya:

SHAPE {SELECT * FROM teams}   
APPEND ({SELECT * FROM games WHERE home_team = ? OR visiting_team = ?}   
        RELATE team_id TO PARAMETER 0,   
               team_id TO PARAMETER 1)   

Contoh ini mengeksploitasi fleksibilitas klausa SQL WHERE yang lebih besar untuk mendapatkan hasil yang Anda butuhkan.

Catatan

Saat menggunakan klausa WHERE, parameter tidak dapat menggunakan jenis data SQL untuk teks, ntext, dan gambar atau kesalahan akan menghasilkan yang berisi deskripsi berikut: Invalid operator for data type.

Lihat juga

Contoh Pembentukan Data
Tata Bahasa Bentuk Formal
Bentuk Perintah Secara Umum