Membuat Pernyataan yang Dicari

Penting

Fitur ini akan dihapus dalam versi Windows yang akan datang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini. Microsoft merekomendasikan penggunaan fungsionalitas kursor driver.

Untuk mendukung pernyataan pembaruan dan penghapusan yang diposisikan, pustaka kursor membuat pernyataan UPDATE atau DELETE yang dicari dari pernyataan yang diposisikan. Untuk mendukung panggilan ke SQLGetData dalam blok data, pustaka kursor membuat pernyataan SELECT yang dicari untuk membuat kumpulan hasil yang berisi baris data saat ini. Dalam setiap pernyataan ini, klausa WHERE menghitung nilai yang disimpan dalam cache untuk setiap kolom terikat yang mengembalikan SQL_PRED_SEARCHABLE atau SQL_PRED_BASIC untuk pengidentifikasi bidang SQL_DESC_SEARCHABLE di SQLColAttribute.

Perhatian

Klausa WHERE yang dibangun oleh pustaka kursor untuk mengidentifikasi baris saat ini dapat gagal mengidentifikasi baris apa pun, mengidentifikasi baris yang berbeda, atau mengidentifikasi lebih dari satu baris.

Jika pernyataan pembaruan atau penghapusan yang diposisikan memengaruhi lebih dari satu baris, pustaka kursor memperbarui array status baris hanya untuk baris tempat kursor diposisikan dan mengembalikan SQL_SUCCESS_WITH_INFO dan SQLSTATE 01001 (Konflik operasi kursor). Jika pernyataan tidak mengidentifikasi baris apa pun, pustaka kursor tidak memperbarui array status baris dan mengembalikan SQL_SUCCESS_WITH_INFO dan SQLSTATE 01001 (Konflik operasi kursor). Aplikasi dapat memanggil SQLRowCount untuk menentukan jumlah baris yang diperbarui atau dihapus.

Jika klausa SELECT yang digunakan untuk memosisikan kursor untuk panggilan ke SQLGetData mengidentifikasi lebih dari satu baris, SQLGetData tidak dijamin untuk mengembalikan data yang benar. Jika tidak mengidentifikasi baris apa pun, SQLGetData mengembalikan SQL_NO_DATA.

Jika aplikasi sesuai dengan panduan berikut, klausa WHERE yang dibangun oleh pustaka kursor harus mengidentifikasi baris saat ini secara unik, kecuali jika ini tidak mungkin, seperti ketika sumber data berisi baris duplikat.

  • Mengikat kolom yang mengidentifikasi baris secara unik. Jika kolom terikat tidak mengidentifikasi baris secara unik, klausa WHERE yang dibangun oleh pustaka kursor mungkin mengidentifikasi lebih dari satu baris. Dalam pernyataan pembaruan atau penghapusan yang diposisikan, klausul tersebut dapat menyebabkan lebih dari satu baris diperbarui atau dihapus. Dalam panggilan ke SQLGetData, klausa seperti itu dapat menyebabkan driver mengembalikan data untuk baris yang salah. Mengikat semua kolom dalam kunci unik menjamin bahwa setiap baris diidentifikasi secara unik.

  • Alokasikan buffer data yang cukup besar sehingga tidak ada pemotongan yang terjadi. Cache pustaka kursor adalah salinan nilai dalam buffer set baris yang terikat ke tataan hasil dengan SQLBindCol. Jika data dipotong ketika ditempatkan di buffer ini, data juga akan dipotong dalam cache. Klausa WHERE yang dibangun dari nilai terpotong mungkin tidak mengidentifikasi baris yang mendasar di sumber data dengan benar.

  • Tentukan buffer panjang non-null untuk data C biner. Pustaka kursor mengalokasikan buffer panjang dalam cache-nya hanya jika argumen StrLen_or_IndPtr di SQLBindCol bukan null. Saat argumen TargetType SQL_C_BINARY, pustaka kursor memerlukan panjang data biner untuk membuat klausa WHERE dari data. Jika tidak ada buffer panjang untuk kolom SQL_C_BINARY dan aplikasi memanggil SQLGetData atau mencoba menjalankan pernyataan pembaruan atau penghapusan yang diposisikan, pustaka kursor mengembalikan SQL_ERROR dan SQLSTATE SL014 (Permintaan yang diposisikan dikeluarkan dan tidak semua bidang jumlah kolom di-buffer).

  • Tentukan buffer panjang non-null untuk kolom yang dapat diubah ke null. Pustaka kursor mengalokasikan buffer panjang dalam cache-nya hanya jika argumen StrLen_or_IndPtr di SQLBindCol bukan null. Karena SQL_NULL_DATA disimpan dalam buffer panjang, pustaka kursor mengasumsikan bahwa kolom apa pun yang tidak ada buffer panjangnya ditentukan tidak dapat diubah ke null. Jika tidak ada kolom panjang yang ditentukan untuk kolom yang dapat diubah ke null, pustaka kursor membuat klausa WHERE yang menggunakan nilai data untuk kolom tersebut. Klausa ini tidak akan mengidentifikasi baris dengan benar.