Bagikan melalui


Pengikatan Bijak Baris

Saat menggunakan pengikatan baris-bijaksana, aplikasi menentukan struktur yang berisi satu atau dua, atau dalam beberapa kasus tiga, elemen untuk setiap kolom yang datanya akan dikembalikan. Elemen pertama menyimpan nilai data, dan elemen kedua memegang buffer panjang/indikator. Indikator dan nilai panjang dapat disimpan dalam buffer terpisah dengan mengatur bidang deskriptor SQL_DESC_INDICATOR_PTR dan SQL_DESC_OCTET_LENGTH_PTR ke nilai yang berbeda; jika ini dilakukan, struktur berisi elemen ketiga. Aplikasi kemudian mengalokasikan array struktur ini, yang berisi elemen sebanyak ada baris dalam set baris.

Aplikasi mendeklarasikan ukuran struktur ke driver dengan atribut pernyataan SQL_ATTR_ROW_BIND_TYPE dan mengikat alamat setiap anggota dalam elemen pertama array. Dengan demikian, driver dapat menghitung alamat data untuk baris dan kolom tertentu sebagai

Address = Bound Address + ((Row Number - 1) * Structure Size)  

di mana baris diberi nomor dari 1 hingga ukuran set baris. (Satu dikurangi dari nomor baris karena pengindeksan array di C berbasis nol.) Ilustrasi berikut menunjukkan cara kerja pengikatan baris-bijaksana. Umumnya, hanya kolom yang akan terikat yang disertakan dalam struktur. Struktur dapat berisi bidang yang tidak terkait dengan kolom tataan hasil. Kolom dapat ditempatkan dalam struktur dalam urutan apa pun tetapi ditampilkan dalam urutan berurutan untuk kejelasan.

Shows row-wise binding

Misalnya, kode berikut membuat struktur dengan elemen untuk mengembalikan data untuk kolom OrderID, SalesPerson, dan Status, dan panjang/indikator untuk kolom SalesPerson dan Status. Ini mengalokasikan 10 struktur ini dan mengikatnya ke kolom OrderID, SalesPerson, dan Status.

#define ROW_ARRAY_SIZE 10  
  
// Define the ORDERINFO struct and allocate an array of 10 structs.  
typedef struct {  
   SQLUINTEGER   OrderID;  
   SQLINTEGER    OrderIDInd;  
   SQLCHAR       SalesPerson[11];  
   SQLINTEGER    SalesPersonLenOrInd;  
   SQLCHAR       Status[7];  
   SQLINTEGER    StatusLenOrInd;  
} ORDERINFO;  
ORDERINFO OrderInfoArray[ROW_ARRAY_SIZE];  
  
SQLULEN    NumRowsFetched;  
SQLUSMALLINT   RowStatusArray[ROW_ARRAY_SIZE], i;  
SQLRETURN      rc;  
SQLHSTMT       hstmt;  
  
// Specify the size of the structure with the SQL_ATTR_ROW_BIND_TYPE  
// statement attribute. This also declares that row-wise binding will  
// be used. Declare the rowset size with the SQL_ATTR_ROW_ARRAY_SIZE  
// statement attribute. Set the SQL_ATTR_ROW_STATUS_PTR statement  
// attribute to point to the row status array. Set the  
// SQL_ATTR_ROWS_FETCHED_PTR statement attribute to point to  
// NumRowsFetched.  
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_TYPE, sizeof(ORDERINFO), 0);  
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, ROW_ARRAY_SIZE, 0);  
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, RowStatusArray, 0);  
SQLSetStmtAttr(hstmt, SQL_ATTR_ROWS_FETCHED_PTR, &NumRowsFetched, 0);  
  
// Bind elements of the first structure in the array to the OrderID,  
// SalesPerson, and Status columns.  
SQLBindCol(hstmt, 1, SQL_C_ULONG, &OrderInfoArray[0].OrderID, 0, &OrderInfoArray[0].OrderIDInd);  
SQLBindCol(hstmt, 2, SQL_C_CHAR, OrderInfoArray[0].SalesPerson,  
            sizeof(OrderInfoArray[0].SalesPerson),  
            &OrderInfoArray[0].SalesPersonLenOrInd);  
SQLBindCol(hstmt, 3, SQL_C_CHAR, OrderInfoArray[0].Status,  
            sizeof(OrderInfoArray[0].Status), &OrderInfoArray[0].StatusLenOrInd);  
  
// Execute a statement to retrieve rows from the Orders table.  
SQLExecDirect(hstmt, "SELECT OrderID, SalesPerson, Status FROM Orders", SQL_NTS);  
  
// Fetch up to the rowset size number of rows at a time. Print the actual  
// number of rows fetched; this number is returned in NumRowsFetched.  
// Check the row status array to print only those rows successfully  
// fetched. Code to check if rc equals SQL_SUCCESS_WITH_INFO or  
// SQL_ERRORnot shown.  
while ((rc = SQLFetchScroll(hstmt,SQL_FETCH_NEXT,0)) != SQL_NO_DATA) {  
   for (i = 0; i < NumRowsFetched; i++) {  
      if (RowStatusArray[i] == SQL_ROW_SUCCESS|| RowStatusArray[i] ==   
         SQL_ROW_SUCCESS_WITH_INFO) {  
         if (OrderInfoArray[i].OrderIDInd == SQL_NULL_DATA)  
            printf(" NULL      ");  
         else  
            printf("%d\t", OrderInfoArray[i].OrderID);  
         if (OrderInfoArray[i].SalesPersonLenOrInd == SQL_NULL_DATA)  
            printf(" NULL      ");  
         else  
            printf("%s\t", OrderInfoArray[i].SalesPerson);  
         if (OrderInfoArray[i].StatusLenOrInd == SQL_NULL_DATA)  
            printf(" NULL\n");  
         else  
            printf("%s\n", OrderInfoArray[i].Status);  
      }  
   }  
}  
  
// Close the cursor.  
SQLCloseCursor(hstmt);