Megosztás:


Row-Wise kötés

Sorszintű kötés használatakor az alkalmazás egy vagy két, bizonyos esetekben három elemet tartalmazó struktúrát határoz meg minden olyan oszlophoz, amelynek adatait vissza szeretné adni. Az első elem az adatértéket, a második pedig a hossz-/mutatópuffert tárolja. A jelzők és a hosszértékek külön pufferekben tárolhatók úgy, hogy a SQL_DESC_INDICATOR_PTR és SQL_DESC_OCTET_LENGTH_PTR leíró mezőket különböző értékekre állítja; ha ez megtörtént, a szerkezet egy harmadik elemet tartalmaz. Az alkalmazás ezután lefoglal egy tömböt ezekből a struktúrákból, amely annyi elemet tartalmaz, amennyi sor van a sorhalmazban.

Az alkalmazás deklarálja a struktúra méretét az illesztőnek a SQL_ATTR_ROW_BIND_TYPE utasítás attribútummal, és a tömb első elemében minden egyes tag címét megköti. Így az illesztő kiszámíthatja egy adott sor és oszlop adatainak címét a következő módon:

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

ahol a sorok száma 1 és a sorhalmaz mérete között van. (Az egyiket kivonja a sorszámból, mert a C tömbindexelése nulla alapú.) Az alábbi ábra a sorszintű kötés működését mutatja be. Általában csak a kötendő oszlopok szerepelnek a struktúrában. A struktúra olyan mezőket tartalmazhat, amelyek nem kapcsolódnak az eredményhalmaz oszlopaihoz. Az oszlopok bármilyen sorrendben elhelyezhetők a struktúrában, de az egyértelműség érdekében szekvenciális sorrendben jelennek meg.

Sor szerinti kötés megjelenítése

A következő kód például létrehoz egy struktúrát olyan elemekkel, amelyekben az OrderID, az Üzletkötő és az Állapot oszlop adatait, valamint az Üzletkötő és az Állapot oszlopok hosszát/jelzőit adja vissza. 10 ilyen struktúrát foglal le, és az OrderID, a SalesPerson és az Status oszlophoz köti őket.

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