Bagikan melalui


Menggunakan Nilai Panjang dan Indikator

Buffer panjang/indikator digunakan untuk melewati panjang byte data dalam buffer data atau indikator khusus seperti SQL_NULL_DATA, yang menunjukkan bahwa data adalah NULL. Tergantung pada fungsi di mana ia digunakan, buffer panjang/indikator didefinisikan menjadi SQLINTEGER atau SQLSMALLINT. Oleh karena itu, diperlukan satu argumen untuk menggambarkannya. Jika buffer data adalah buffer input yang tidak dideferensikan, argumen ini berisi panjang byte data itu sendiri atau nilai indikator. Nama ini sering dinamai StrLen_or_Ind atau nama serupa. Misalnya, kode berikut memanggil SQLPutData untuk meneruskan buffer yang penuh data; panjang byte (ValueLen) diteruskan langsung karena buffer data (ValuePtr) adalah buffer input.

SQLCHAR      ValuePtr[50];  
SQLINTEGER   ValueLen;  
  
// Call local function to place data in ValuePtr. In ValueLen, return the  
// number of bytes of data placed in ValuePtr. If there is not enough  
// data, this will be less than 50.  
FillBuffer(ValuePtr, sizeof(ValuePtr), &ValueLen);  
  
// Call SQLPutData to send the data to the driver.  
SQLPutData(hstmt, ValuePtr, ValueLen);  

Jika buffer data adalah buffer input yang ditangguhkan, buffer output yang tidak ditunda, atau buffer output, argumen berisi alamat buffer panjang/indikator. Nama ini sering dinamai StrLen_or_IndPtr atau nama serupa. Misalnya, kode berikut memanggil SQLGetData untuk mengambil buffer yang penuh data; panjang byte dikembalikan ke aplikasi dalam buffer panjang/indikator (ValueLenOrInd), yang alamatnya diteruskan ke SQLGetData karena buffer data yang sesuai (ValuePtr) adalah buffer output yang tidak disimpulkan.

SQLCHAR      ValuePtr[50];  
SQLINTEGER   ValueLenOrInd;  
SQLGetData(hstmt, 1, SQL_C_CHAR, ValuePtr, sizeof(ValuePtr), &ValueLenOrInd);  

Kecuali dilarang secara khusus, argumen buffer panjang/indikator bisa 0 (jika input nondeferred) atau pointer null (jika output atau input yang ditangguhkan). Untuk buffer input, ini menyebabkan driver mengabaikan panjang byte data. Ini mengembalikan kesalahan saat meneruskan data panjang variabel tetapi umum saat meneruskan data non-null dan panjang tetap, karena tidak diperlukan panjang atau nilai indikator. Untuk buffer output, ini menyebabkan driver tidak mengembalikan panjang byte data atau nilai indikator. Ini adalah kesalahan jika data yang dikembalikan oleh driver adalah NULL tetapi umum saat mengambil data dengan panjang tetap dan tidak dapat diubah ke null, karena tidak diperlukan panjang maupun nilai indikator.

Seperti ketika alamat buffer data yang ditangguhkan diteruskan ke driver, alamat buffer panjang/indikator yang ditangguhkan harus tetap valid sampai buffer tidak terikat.

Panjang berikut valid sebagai nilai panjang/indikator:

  • n, di mana n> 0.

  • SQL_NTS. String yang dikirim ke driver dalam buffer data yang sesuai dihentikan null; ini adalah cara mudah bagi pemrogram C untuk meneruskan string tanpa harus menghitung panjang byte mereka. Nilai ini legal hanya ketika aplikasi mengirim data ke driver. Ketika driver mengembalikan data ke aplikasi, driver selalu mengembalikan panjang byte aktual data.

Nilai berikut valid sebagai nilai panjang/indikator. SQL_NULL_DATA disimpan di bidang deskriptor SQL_DESC_INDICATOR_PTR; semua nilai lainnya disimpan di bidang deskriptor SQL_DESC_OCTET_LENGTH_PTR.

  • SQL_NULL_DATA. Data adalah nilai data NULL, dan nilai dalam buffer data terkait diabaikan. Nilai ini hanya legal untuk data SQL yang dikirim ke atau diambil dari driver.

  • SQL_DATA_AT_EXEC. Buffer data tidak berisi data apa pun. Sebagai gantinya, data akan dikirim dengan SQLPutData ketika pernyataan dijalankan atau ketika SQLBulkOperations atau SQLSetPos dipanggil. Nilai ini hanya legal untuk data SQL yang dikirim ke driver. Untuk informasi selengkapnya, lihat SQLBindParameter, SQLBulkOperations, dan SQLSetPos.

  • Hasil makro SQL_LEN_DATA_AT_EXEC(panjang). Nilai ini mirip dengan SQL_DATA_AT_EXEC. Untuk informasi selengkapnya, lihat Mengirim Data Panjang.

  • SQL_NO_TOTAL. Driver tidak dapat menentukan jumlah byte data panjang yang masih tersedia untuk dikembalikan dalam buffer output. Nilai ini hanya legal untuk data SQL yang diambil dari driver.

  • SQL_DEFAULT_PARAM. Prosedurnya adalah menggunakan nilai default parameter input dalam prosedur alih-alih nilai dalam buffer data yang sesuai.

  • SQL_COLUMN_IGNORE. SQLBulkOperations atau SQLSetPos adalah mengabaikan nilai dalam buffer data. Saat memperbarui baris data dengan panggilan ke SQLBulkOperations atau SQLSetPos, nilai kolom tidak diubah. Saat menyisipkan baris data baru dengan panggilan ke SQLBulkOperations, nilai kolom diatur ke defaultnya atau, jika kolom tidak memiliki default, ke NULL.