Bagikan melalui


Odbc Eksekusi yang Disiapkan

Eksekusi yang disiapkan adalah cara yang efisien untuk menjalankan pernyataan lebih dari sekali. Pernyataan ini pertama kali dikompilasi, atau disiapkan, ke dalam rencana akses. Rencana akses kemudian dijalankan satu atau beberapa kali di lain waktu. Untuk informasi selengkapnya tentang paket akses, lihat Memproses Pernyataan SQL.

Eksekusi yang disiapkan umumnya digunakan oleh aplikasi vertikal dan kustom untuk berulang kali menjalankan pernyataan SQL berparameter yang sama. Misalnya, kode berikut menyiapkan pernyataan untuk memperbarui harga berbagai bagian. Kemudian menjalankan pernyataan beberapa kali dengan nilai parameter yang berbeda setiap kali.

SQLREAL       Price;  
SQLUINTEGER   PartID;  
SQLINTEGER    PartIDInd = 0, PriceInd = 0;  
  
// Prepare a statement to update salaries in the Employees table.  
SQLPrepare(hstmt, "UPDATE Parts SET Price = ? WHERE PartID = ?", SQL_NTS);  
  
// Bind Price to the parameter for the Price column and PartID to  
// the parameter for the PartID column.  
SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_FLOAT, SQL_REAL, 7, 0,  
                  &Price, 0, &PriceInd);  
SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_ULONG, SQL_INTEGER, 10, 0,  
                  &PartID, 0, &PartIDInd);  
  
// Repeatedly execute the statement.  
while (GetPrice(&PartID, &Price)) {  
   SQLExecute(hstmt);  
}  

Eksekusi yang disiapkan lebih cepat daripada eksekusi langsung untuk pernyataan yang dijalankan lebih dari sekali, terutama karena pernyataan dikompilasi hanya sekali; pernyataan yang dijalankan secara langsung dikompilasi setiap kali dijalankan. Eksekusi yang disiapkan juga dapat memberikan pengurangan lalu lintas jaringan karena driver dapat mengirim pengidentifikasi rencana akses ke sumber data setiap kali pernyataan dijalankan, daripada seluruh pernyataan SQL, jika sumber data mendukung pengidentifikasi rencana akses.

Aplikasi dapat mengambil metadata untuk hasil yang ditetapkan setelah pernyataan disiapkan dan sebelum dijalankan. Namun, mengembalikan metadata untuk pernyataan yang disiapkan dan tidak dieksekusi mahal untuk beberapa driver dan harus dihindari oleh aplikasi yang dapat dioperasikan jika memungkinkan. Untuk informasi selengkapnya, lihat Metadata Tataan Hasil.

Eksekusi yang disiapkan tidak boleh digunakan untuk pernyataan yang dijalankan satu kali. Untuk pernyataan seperti itu, sedikit lebih lambat daripada eksekusi langsung karena memerlukan panggilan fungsi ODBC tambahan.

Penting

Melakukan atau mengembalikan transaksi, baik dengan secara eksplisit memanggil SQLEndTran atau dengan bekerja dalam mode penerapan otomatis, menyebabkan beberapa sumber data menghapus paket akses untuk semua pernyataan pada koneksi. Untuk informasi selengkapnya, lihat opsi SQL_CURSOR_COMMIT_BEHAVIOR dan SQL_CURSOR_ROLLBACK_BEHAVIOR dalam deskripsi fungsi SQLGetInfo .

Untuk menyiapkan dan menjalankan pernyataan, aplikasi:

  1. Memanggil SQLPrepare dan meneruskannya string yang berisi pernyataan SQL.

  2. Mengatur nilai parameter apa pun. Parameter sebenarnya dapat diatur sebelum atau sesudah menyiapkan pernyataan. Untuk informasi selengkapnya, lihat Parameter Pernyataan, nanti di bagian ini.

  3. Memanggil SQLExecute dan melakukan pemrosesan tambahan yang diperlukan, seperti mengambil data.

  4. Mengulangi langkah 2 dan 3 seperlunya.

  5. Ketika SQLPrepare dipanggil, driver:

    • Memodifikasi pernyataan SQL untuk menggunakan tata bahasa SQL sumber data tanpa mengurai pernyataan. Ini termasuk mengganti urutan escape yang dibahas dalam Urutan Escape di ODBC. Aplikasi dapat mengambil bentuk pernyataan SQL yang dimodifikasi dengan memanggil SQLNativeSql. Urutan escape tidak diganti jika atribut pernyataan SQL_ATTR_NOSCAN diatur.

    • Mengirim pernyataan ke sumber data untuk persiapan.

    • Menyimpan pengidentifikasi rencana akses yang dikembalikan untuk eksekusi nanti (jika persiapan berhasil) atau mengembalikan kesalahan apa pun (jika persiapan gagal). Kesalahan termasuk kesalahan syntactic seperti SQLSTATE 42000 (Kesalahan sintaks atau pelanggaran akses) dan kesalahan semantik seperti SQLSTATE 42S02 (Tabel dasar atau tampilan tidak ditemukan).

      Catatan

      Beberapa driver tidak mengembalikan kesalahan pada saat ini tetapi sebaliknya mengembalikannya ketika pernyataan dijalankan atau ketika fungsi katalog dipanggil. Dengan demikian, SQLPrepare mungkin tampak berhasil ketika sebenarnya telah gagal.

  6. Ketika SQLExecute dipanggil, driver:

    • Mengambil nilai parameter saat ini dan mengonversinya seperlunya. Untuk informasi selengkapnya, lihat Parameter Pernyataan, nanti di bagian ini.

    • Mengirim pengidentifikasi paket akses dan nilai parameter yang dikonversi ke sumber data.

    • Mengembalikan kesalahan apa pun. Ini umumnya adalah kesalahan run-time seperti SQLSTATE 24000 (Status kursor tidak valid). Namun, beberapa driver mengembalikan kesalahan syntactic dan semantik pada saat ini.

Jika sumber data tidak mendukung persiapan pernyataan, driver harus menirunya sejauh mungkin. Misalnya, driver mungkin tidak melakukan apa pun ketika SQLPrepare dipanggil dan kemudian melakukan eksekusi langsung pernyataan ketika SQLExecute dipanggil.

Jika sumber data mendukung pemeriksaan sintaks tanpa eksekusi, driver mungkin mengirimkan pernyataan untuk memeriksa kapan SQLPrepare dipanggil dan mengirimkan pernyataan untuk eksekusi saat SQLExecute dipanggil.

Jika driver tidak dapat meniru persiapan pernyataan, driver menyimpan pernyataan ketika SQLPrepare dipanggil dan mengirimkannya untuk dieksekusi ketika SQLExecute dipanggil.

Karena persiapan pernyataan yang ditimulasi tidak sempurna, SQLExecute dapat mengembalikan kesalahan apa pun yang biasanya dikembalikan oleh SQLPrepare.