Membuat Pernyataan yang Dicari

Important

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 fungsi kursor driver.

Untuk mendukung pernyataan pembaruan dan penghapusan yang diposisikan, pustaka kursor membuat pernyataan yang dicari UPDATE atau DELETE 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 masing-masing 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.

Caution

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 hapus 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 memposisikan kursor untuk panggilan ke SQLGetData mengidentifikasi lebih dari satu baris, SQLGetData tidak dijamin akan mengembalikan data yang benar. Jika tidak mengidentifikasi baris apa pun, SQLGetData mengembalikan SQL_NO_DATA.

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

  • Ikat kolom yang mengidentifikasi baris secara unik. Jika kolom terikat tidak mengidentifikasi baris secara unik, klausa WHERE yang dibuat oleh pustaka kursor mungkin mengidentifikasi lebih dari satu baris. Dalam pernyataan pembaruan atau penghapusan yang diposisikan, klausa semacam itu 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 terjadi pemotongan. Cache pustaka kursor adalah salinan nilai dalam buffer kumpulan baris yang terikat ke kumpulan hasil dengan SQLBindCol. Jika data terpotong saat ditempatkan di buffer ini, data juga akan dipotong di cache. Klausa WHERE yang dibuat dari nilai yang terpotong mungkin tidak mengidentifikasi baris yang mendasarinya dengan benar dalam sumber data.

  • Tentukan buffer panjang non-null untuk data C biner. Pustaka kursor mengalokasikan buffer panjang dalam cachenya hanya jika argumen StrLen_or_IndPtr di SQLBindCol non-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 hapus 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 dengan null. Pustaka kursor mengalokasikan buffer panjang dalam cachenya hanya jika argumen StrLen_or_IndPtr di SQLBindCol non-null. Karena SQL_NULL_DATA disimpan dalam buffer panjang, pustaka kursor mengasumsikan bahwa kolom apa pun yang tidak ditentukan buffer panjangnya tidak dapat ditentukan tidak dapat diubah ke null. Jika tidak ada kolom panjang yang ditentukan untuk kolom yang dapat diubah oleh null, pustaka kursor membuat klausa WHERE yang menggunakan nilai data untuk kolom. Klausa ini tidak akan mengidentifikasi baris dengan benar.