Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Wanneer u rijgebonden binding gebruikt, definieert een toepassing een structuur met een of twee, of in sommige gevallen drie elementen voor elke kolom waarvoor gegevens moeten worden geretourneerd. Het eerste element bevat de gegevenswaarde en het tweede element bevat de lengte/indicatorbuffer. Indicatoren en lengtewaarden kunnen in afzonderlijke buffers worden opgeslagen door de SQL_DESC_INDICATOR_PTR- en SQL_DESC_OCTET_LENGTH_PTR descriptorvelden in te stellen op verschillende waarden; Als dit gebeurt, bevat de structuur een derde element. De toepassing wijst vervolgens een matrix van deze structuren toe, die zo veel elementen bevat als er rijen in de rijenset zijn.
De toepassing declareert de grootte van de structuur aan het stuurprogramma met het instructiekenmerk SQL_ATTR_ROW_BIND_TYPE en koppelt het adres van elk lid in het eerste element van de array. Het stuurprogramma kan dus het adres van de gegevens voor een bepaalde rij en kolom berekenen als
Address = Bound Address + ((Row Number - 1) * Structure Size)
waarbij rijen worden genummerd van 1 tot de grootte van de rijenset. (Eén wordt afgetrokken van het rijnummer omdat matrixindexering in C op nul is gebaseerd.) In de volgende afbeelding ziet u hoe rijgebonden binding werkt. Over het algemeen worden alleen kolommen die gebonden zijn, opgenomen in de structuur. De structuur kan velden bevatten die niet gerelateerd zijn aan kolommen in de resultatenset. De kolommen kunnen in elke volgorde in de structuur worden geplaatst, maar worden in opeenvolgende volgorde weergegeven voor duidelijkheid.
Met de volgende code wordt bijvoorbeeld een structuur gemaakt met elementen waarin gegevens worden geretourneerd voor de kolommen OrderID, SalesPerson en Status, en lengte/indicatoren voor de kolommen SalesPerson en Status. Er worden 10 van deze structuren toegewezen en gekoppeld aan de kolommen OrderID, SalesPerson en 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);