Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Met de updatebewerking van SQLSetPos worden een of meer geselecteerde rijen van een tabel bijgewerkt met behulp van gegevens in de applicatiebuffers voor elke gebonden kolom (tenzij de waarde in de lengte-/indicatorbuffer SQL_COLUMN_IGNORE is). Kolommen die niet gebonden zijn, worden niet bijgewerkt.
Als u rijen wilt bijwerken met SQLSetPos, doet de toepassing het volgende:
Hiermee worden de nieuwe gegevenswaarden in de rijensetbuffers geplaatst. Zie Long Data en SQLSetPos en SQLBulkOperations voor meer informatie over het verzenden van lange gegevens met SQLSetPos.
Hiermee stelt u de waarde in de lengte/indicatorbuffer van elke kolom in, indien nodig. Dit is de bytelengte van de gegevens of SQL_NTS voor kolommen die zijn gebonden aan tekenreeksbuffers, de bytelengte van de gegevens voor kolommen die zijn gebonden aan binaire buffers en SQL_NULL_DATA voor kolommen die moeten worden ingesteld op NULL.
Hiermee stelt u de waarde in de lengte/indicatorbuffer van die kolommen in die niet moeten worden bijgewerkt naar SQL_COLUMN_IGNORE. Hoewel de toepassing deze stap kan overslaan en bestaande gegevens opnieuw kan verzenden, is dit inefficiƫnt en riskeert het verzenden van waarden naar de gegevensbron die zijn afgekapt toen ze werden gelezen.
Roept SQLSetPos aan met Bewerking ingesteld op SQL_UPDATE en RowNumber ingesteld op het aantal rijen dat moet worden bijgewerkt. Als RowNumber 0 is, worden alle rijen in de rijenset bijgewerkt.
Nadat SQLSetPos is geretourneerd, wordt de huidige rij ingesteld op de bijgewerkte rij.
Bij het bijwerken van alle rijen van de rijenset (RowNumber is gelijk aan 0), kan een toepassing de update van bepaalde rijen uitschakelen door de bijbehorende elementen van de rijbewerkingmatrix (die wordt verwezen door het kenmerk van de SQL_ATTR_ROW_OPERATION_PTR instructie) in te stellen op SQL_ROW_IGNORE. De rijbewerkingsarray komt qua grootte en aantal elementen overeen met de rijstatusarray (aangegeven door het statementattribuut SQL_ATTR_ROW_STATUS_PTR). Als u alleen de rijen in de resultatenset wilt bijwerken die zijn opgehaald en die niet zijn verwijderd uit de rijenset, gebruikt de toepassing de rijstatusmatrix van de functie die de rijset heeft opgehaald als de rijbewerkingmatrix naar SQLSetPos.
Voor elke rij die als update naar de gegevensbron wordt verzonden, moeten de toepassingsbuffers geldige rijgegevens bevatten. Als de toepassingsbuffers zijn opgevuld door op te halen en als een rijstatusmatrix is onderhouden, mogen de waarden op elk van deze rijposities niet zijn SQL_ROW_DELETED, SQL_ROW_ERROR of SQL_ROW_NOROW.
Met de volgende code kan een gebruiker bijvoorbeeld door de tabel Klanten bladeren en nieuwe rijen bijwerken, verwijderen of toevoegen. Hiermee worden de nieuwe gegevens in de rijensetbuffers geplaatst voordat u SQLSetPos aanroept om nieuwe rijen bij te werken of toe te voegen. Aan het einde van de rijensetbuffers wordt een extra rij toegewezen voor het opslaan van nieuwe rijen; Dit voorkomt dat bestaande gegevens worden overschreven wanneer gegevens voor een nieuwe rij in de buffers worden geplaatst.
#define UPDATE_ROW 100
#define DELETE_ROW 101
#define ADD_ROW 102
SQLUINTEGER CustIDArray[11];
SQLCHAR NameArray[11][51], AddressArray[11][51],
PhoneArray[11][11];
SQLINTEGER CustIDIndArray[11], NameLenOrIndArray[11],
AddressLenOrIndArray[11],
PhoneLenOrIndArray[11];
SQLUSMALLINT RowStatusArray[10], Action, RowNum;
SQLRETURN rc;
SQLHSTMT hstmt;
// Set the SQL_ATTR_ROW_BIND_TYPE statement attribute to use column-wise
// binding. 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.
SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, SQL_CURSOR_KEYSET_DRIVEN, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_BIND_TYPE, SQL_BIND_BY_COLUMN, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_ARRAY_SIZE, 10, 0);
SQLSetStmtAttr(hstmt, SQL_ATTR_ROW_STATUS_PTR, RowStatusArray, 0);
// Bind arrays to the CustID, Name, Address, and Phone columns.
SQLBindCol(hstmt, 1, SQL_C_ULONG, CustIDArray, 0, CustIDIndArray);
SQLBindCol(hstmt, 2, SQL_C_CHAR, NameArray, sizeof(NameArray[0]), NameLenOrIndArray);
SQLBindCol(hstmt, 3, SQL_C_CHAR, AddressArray, sizeof(AddressArray[0]),
AddressLenOrIndArray);
SQLBindCol(hstmt, 4, SQL_C_CHAR, PhoneArray, sizeof(PhoneArray[0]),
PhoneLenOrIndArray);
// Execute a statement to retrieve rows from the Customers table.
SQLExecDirect(hstmt, "SELECT CustID, Name, Address, Phone FROM Customers", SQL_NTS);
// Fetch and display the first 10 rows.
rc = SQLFetchScroll(hstmt, SQL_FETCH_NEXT, 0);
DisplayData(CustIDArray, CustIDIndArray, NameArray, NameLenOrIndArray, AddressArray,
AddressLenOrIndArray, PhoneArray, PhoneLenOrIndArray, RowStatusArray);
// Call GetAction to get an action and a row number from the user.
while (GetAction(&Action, &RowNum)) {
switch (Action) {
case SQL_FETCH_NEXT:
case SQL_FETCH_PRIOR:
case SQL_FETCH_FIRST:
case SQL_FETCH_LAST:
case SQL_FETCH_ABSOLUTE:
case SQL_FETCH_RELATIVE:
// Fetch and display the requested data.
SQLFetchScroll(hstmt, Action, RowNum);
DisplayData(CustIDArray, CustIDIndArray,
NameArray, NameLenOrIndArray,
AddressArray, AddressLenOrIndArray,
PhoneArray, PhoneLenOrIndArray, RowStatusArray);
break;
case UPDATE_ROW:
// Place the new data in the rowset buffers and update the
// specified row.
GetNewData(&CustIDArray[RowNum - 1], &CustIDIndArray[RowNum - 1],
NameArray[RowNum - 1], &NameLenOrIndArray[RowNum - 1],
AddressArray[RowNum - 1], &AddressLenOrIndArray[RowNum - 1],
PhoneArray[RowNum - 1], &PhoneLenOrIndArray[RowNum - 1]);
SQLSetPos(hstmt, RowNum, SQL_UPDATE, SQL_LOCK_NO_CHANGE);
break;
case DELETE_ROW:
// Delete the specified row.
SQLSetPos(hstmt, RowNum, SQL_DELETE, SQL_LOCK_NO_CHANGE);
break;
case ADD_ROW:
// Place the new data in the rowset buffers at index 10.
// This is an extra element for new rows so rowset data is
// not overwritten. Insert the new row. Row 11 corresponds
// to index 10.
GetNewData(&CustIDArray[10], &CustIDIndArray[10],
NameArray[10], &NameLenOrIndArray[10],
AddressArray[10], &AddressLenOrIndArray[10],
PhoneArray[10], &PhoneLenOrIndArray[10]);
SQLSetPos(hstmt, 11, SQL_ADD, SQL_LOCK_NO_CHANGE);
break;
}
}
// Close the cursor.
SQLCloseCursor(hstmt);