Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Az SQLSetPos frissítési művelete egy tábla egy vagy több kijelölt sorát frissíti az adatforrásban az egyes kötött oszlopokhoz tartozó alkalmazáspufferek adatainak használatával (kivéve, ha a hossz-/mutatópuffer értéke SQL_COLUMN_IGNORE). Nem kötött oszlopok nem lesznek frissítve.
A sorok SQLSetPos használatával való frissítéséhez az alkalmazás a következőket teszi:
Az új adatértékeket a sorhalmaz puffereibe helyezi. A hosszú adatok SQLSetPos-okkal való küldéséhez lásd: Long Data and SQLSetPos and SQLBulkOperations.
Szükség szerint beállítja az egyes oszlopok hossz/mutató pufferének értékét. Ez a karakterláncpufferekhez kötött oszlopok esetében az adatok bájthossza vagy az SQL_NTS, a bináris pufferekhez kötött oszlopok esetében az adatok bájthossza, valamint az SQL_NULL_DATA a NULL értékre állítandó oszlopokhoz.
Azoknak az oszlopoknak a hossz/mutató pufferében lévő értéket állítja be SQL_COLUMN_IGNORE-ra, amelyeket nem kell frissíteni. Bár az alkalmazás kihagyhatja ezt a lépést, és újraküldheti a meglévő adatokat, ez nem hatékony, és azt kockáztatja, hogy az olvasáskor csonkolt adatforrásnak küld értékeket.
Meghívja a SQLSetPos függvényt, ahol az Operation értéke SQL_UPDATE, és a RowNumber értéke a frissítendő sor száma. Ha a RowNumber értéke 0, a sorhalmaz összes sora frissül.
Az SQLSetPos visszatérése után az aktuális sor a frissített sorra van állítva.
A sorhalmaz összes sorának frissítésekor (a RowNumber értéke 0), az alkalmazás letilthatja bizonyos sorok frissítését a sorműveleti tömb megfelelő elemeinek (a SQL_ATTR_ROW_OPERATION_PTR utasítás attribútum által mutatott) SQL_ROW_IGNORE beállításával. A sorműveleti tömb mérete és száma megegyezik a sorállapot-tömb méretével és számával (erre a SQL_ATTR_ROW_STATUS_PTR utasítás attribútum mutat). Ha csak azokat a sorokat szeretné frissíteni az eredményhalmazban, amelyeket sikeresen lehívtak, és nem töröltek a sorhalmazból, az alkalmazás a sorállapot-tömböt használja annak a függvénynek a sorhalmazából, amely sorműveleti tömbként beolvassa az SQLSetPos-be.
Az adatforrásnak frissítésként küldött összes sor esetében az alkalmazáspuffereknek érvényes soradatokkal kell rendelkezniük. Ha az alkalmazáspufferek beolvasással lettek kitöltve, és egy sorállapot-tömb fenntartása megtörtént, akkor az egyes sorpozíciók értékei nem lehetnek SQL_ROW_DELETED, SQL_ROW_ERROR vagy SQL_ROW_NOROW.
A következő kód például lehetővé teszi, hogy a felhasználó végiggörgetjen az Ügyfelek táblán, és új sorokat frissítsen, töröljön vagy adjon hozzá. Az új adatokat a sorhalmaz puffereibe helyezi, mielőtt meghívja az SQLSetPos-t az új sorok frissítésére vagy hozzáadására. A sorkészlet puffereinek végén egy további sor van lefoglalva az új sorok tárolásához; ez megakadályozza, hogy a meglévő adatok felülíródnak, amikor egy új sor adatait a pufferekbe helyezik.
#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);