Data Panjang dan SQLSetPos dan SQLBulkOperations
Seperti halnya parameter dalam pernyataan SQL, data panjang dapat dikirim saat memperbarui baris dengan SQLBulkOperations atau SQLSetPos atau saat menyisipkan baris dengan SQLBulkOperations. Data dikirim dalam beberapa bagian, dengan beberapa panggilan ke SQLPutData. Kolom yang datanya dikirim pada waktu eksekusi dikenal sebagai kolom data saat eksekusi.
Catatan
Aplikasi sebenarnya dapat mengirim semua jenis data pada waktu eksekusi dengan SQLPutData, meskipun hanya karakter dan data biner yang dapat dikirim dalam beberapa bagian. Namun, jika data cukup kecil agar pas dalam satu buffer, umumnya tidak ada alasan untuk menggunakan SQLPutData. Jauh lebih mudah untuk mengikat buffer dan membiarkan driver mengambil data dari buffer.
Karena kolom data panjang biasanya tidak terikat, aplikasi harus mengikat kolom sebelum memanggil SQLBulkOperations atau SQLSetPos dan membatalkan ikatannya setelah memanggil SQLBulkOperations atau SQLSetPos. Kolom harus terikat karena SQLBulkOperations atau SQLSetPos hanya beroperasi pada kolom terikat dan harus tidak terikat sehingga SQLGetData dapat digunakan untuk mengambil data dari kolom.
Untuk mengirim data pada waktu eksekusi, aplikasi melakukan hal berikut:
Menempatkan nilai 32-bit di buffer set baris alih-alih nilai data. Nilai ini akan dikembalikan ke aplikasi nanti, sehingga aplikasi harus mengaturnya ke nilai yang bermakna, seperti jumlah kolom atau handel file yang berisi data.
Mengatur nilai dalam buffer panjang/indikator ke hasil makro SQL_LEN_DATA_AT_EXEC(panjang). Nilai ini menunjukkan kepada driver bahwa data untuk parameter akan dikirim dengan SQLPutData. Nilai panjang digunakan saat mengirim data panjang ke sumber data yang perlu mengetahui berapa banyak byte data panjang yang akan dikirim sehingga dapat melakukan pra-alokasi ruang. Untuk menentukan apakah sumber data memerlukan nilai ini, aplikasi memanggil SQLGetInfo dengan opsi SQL_NEED_LONG_DATA_LEN. Semua driver harus mendukung makro ini; jika sumber data tidak memerlukan panjang byte, driver dapat mengabaikannya.
Memanggil SQLBulkOperations atau SQLSetPos. Driver menemukan bahwa buffer panjang/indikator berisi hasil makro SQL_LEN_DATA_AT_EXEC(panjang) dan mengembalikan SQL_NEED_DATA sebagai nilai pengembalian fungsi.
Memanggil SQLParamData sebagai respons terhadap nilai pengembalian SQL_NEED_DATA. Jika data panjang perlu dikirim, SQLParamData mengembalikan SQL_NEED_DATA. Dalam buffer yang ditunjukkan oleh argumen ValuePtrPtr , driver mengembalikan nilai unik yang ditempatkan aplikasi di buffer set baris. Jika ada lebih dari satu kolom data-at-execution, aplikasi menggunakan nilai ini untuk menentukan kolom mana yang akan dikirim datanya; driver tidak diperlukan untuk meminta data untuk kolom data-at-execution dalam urutan tertentu.
Memanggil SQLPutData untuk mengirim data kolom ke driver. Jika data kolom tidak pas dalam satu buffer, seperti yang sering terjadi dengan data panjang, aplikasi memanggil SQLPutData berulang kali untuk mengirim data dalam beberapa bagian; terserah driver dan sumber data untuk menyusun ulang data. Jika aplikasi meneruskan data string yang dihentikan null, driver atau sumber data harus menghapus karakter penghentian null sebagai bagian dari proses pembuatan ulang.
Memanggil SQLParamData lagi untuk menunjukkan bahwa SQLParamData telah mengirim semua data untuk kolom tersebut. Jika ada kolom data saat eksekusi yang datanya belum dikirim, driver mengembalikan SQL_NEED_DATA dan nilai unik untuk kolom data-at-execution berikutnya; aplikasi kembali ke langkah 5. Jika data telah dikirim untuk semua kolom data yang sedang dieksekusi, data untuk baris dikirim ke sumber data. SQLParamData kemudian mengembalikan SQL_SUCCESS atau SQL_SUCCESS_WITH_INFO dan dapat mengembalikan SQLSTATE apa pun yang dapat dikembalikan oleh SQLBulkOperations atau SQLSetPos .
Setelah SQLBulkOperations atau SQLSetPos mengembalikan SQL_NEED_DATA dan sebelum data benar-benar dikirim untuk kolom data-at-execution terakhir, pernyataan berada dalam status Perlu Data. Dalam keadaan ini, aplikasi hanya dapat memanggil SQLPutData, SQLParamData, SQLCancel, SQLGetDiagField, atau SQLGetDiagRec; semua fungsi lain mengembalikan SQLSTATE HY010 (Kesalahan urutan fungsi). Memanggil SQLCancel membatalkan eksekusi pernyataan dan mengembalikannya ke status sebelumnya. Untuk informasi selengkapnya, lihat Lampiran B: Tabel Transisi Status ODBC.