Aracılığıyla paylaş


Row-Wise Bağlama

Satır tabanlı bağlama kullanılırken, bir uygulama bir veya iki veya bazı durumlarda verilerin döndürülacağı her sütun için üç öğe içeren bir yapı tanımlar. İlk öğe veri değerini, ikinci öğe ise uzunluk/gösterge arabelleği tutar. Göstergeler ve uzunluk değerleri, SQL_DESC_INDICATOR_PTR ve SQL_DESC_OCTET_LENGTH_PTR tanımlayıcı alanları farklı değerlere ayarlanarak ayrı arabelleklerde depolanabilir; bu yapılırsa, yapı üçüncü bir öğe içerir. Uygulama daha sonra satır kümesinde satır sayısı kadar öğe içeren bu yapılardan oluşan bir dizi ayırır.

Uygulama, SQL_ATTR_ROW_BIND_TYPE deyimi özniteliğiyle sürücüye yapı boyutunu bildirir ve dizinin ilk öğesindeki her üyenin adresini bağlar. Bu nedenle, sürücü belirli bir satır ve sütunun verilerinin adresini şu şekilde hesaplayabilir:

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

burada satırlar 1'den satır kümesinin boyutuna kadar numaralandırılır. (C'de dizi dizin oluşturma sıfır tabanlı olduğundan satır numarasından bir çıkarılır.) Aşağıdaki çizim, satır bazlı bağlama işleminin nasıl yapıldığını göstermektedir. Genellikle, yapıya yalnızca bağlanacak sütunlar eklenir. Yapı, sonuç kümesi sütunlarıyla ilişkili olmayan alanlar içerebilir. Sütunlar herhangi bir sırada yapıya yerleştirilebilir, ancak netlik için sıralı olarak gösterilir.

Satır bazlı bağlamayı gösterir

Örneğin, aşağıdaki kod OrderID, SalesPerson ve Status sütunlarının verilerinin ve SalesPerson ve Status sütunları için uzunluk/göstergelerin döndürüleceği öğeler içeren bir yapı oluşturur. Bu yapılardan 10'unu ayırır ve bunları OrderID, SalesPerson ve Status sütunlarına bağlar.

#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);